文本框绑定没有更新RaisePropertychanged

本文关键字:更新 RaisePropertychanged 绑定 文本 | 更新日期: 2023-09-27 18:16:31

使用Mvvm库,UWP, c#。

问题:视图不会更新文本框的内容,如果值在视图模型中被改变,文本框有焦点的时刻。可以更新没有焦点的文本框的viewmodel属性。

清除混淆:文本框->有焦点->键入->传递到绑定属性->属性设置,更改值并调用RaisePropertyChange。->文本框不更新。

如果绑定到不同TextBox的属性在ViewModel中被更改,并且以该属性为目标调用RaisePropertyChanged,则该TextBox确实得到更新。

的区别似乎是,有焦点的文本框不更新RaisePropertyChanged。在wpf中是这样做的。

下面的代码是一个示例,而不是实际的应用程序。它确实显示了问题,并像实际应用程序一样运行。添加连字符以更改输入。如果RaisePropertyChanged工作,连字符将显示在编辑框中,它没有。

我的页面:

<Page x:Class="BindingTest.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:BindingTest.VML"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
DataContext="{Binding MainViewModel, Source={StaticResource Locator}}" >
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" Margin="0,144,0,109">
    <TextBox x:Name="textBox1" 
             Text="{Binding Item1, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
             HorizontalAlignment="Left" 
             Margin="10,137,0,0" 
             TextWrapping="Wrap" 
             VerticalAlignment="Top" 
             Width="340"/>
    <TextBox x:Name="textBox2" 
             Text="{Binding Item2, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
             HorizontalAlignment="Left" 
             Margin="10,174,0,0" 
             TextWrapping="Wrap"
             VerticalAlignment="Top" 
             Width="340"/>
</Grid>

我的视图模型:

using GalaSoft.MvvmLight;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Input;
namespace BindingTest
{
    public class MainViewModel:ViewModelBase
    {        
        string _item1 = "";
        string _item2 = "";
        public string Item1 {
            get
            {
                return _item1;
            }
            set
            {
                _item1 = value + "-";
                RaisePropertyChanged("Item1");                               
            }
        }
        public string Item2
        {
            get {
                return _item2;
            }
            set
            {
                _item2 = value + "-";
                RaisePropertyChanged("Item2");
            }
        }
    }
}

如果文本输入到其中一个文本框中,则调用属性集,更改值,不更新文本框中的值。

如果我在textbox1的setter中调用textbox2的propertychanged,它将更新:

        public string Item1 {
            get
            {
                return _item1;
            }
            set
            {
                _item2 = value + "-";
                RaisePropertyChanged("Item2");                               
            }
        }

这就好像有焦点的文本框只要有焦点就不会更新它的内容。

文本框绑定没有更新RaisePropertychanged

尝试删除

updateSourceTrigger=PropertyChanged

从你的文本框绑定

RaisePropertyChanged在视图模型上应该足够

我用了一个小技巧:

不调用RaisePropertyChanged(),而是调用以下方法:

    public async void ForceRaisePropertyChanged(string propName)
    {
        await Task.Delay(1);
        RaisePropertyChanged(propName);
    }

效果很好