文本框绑定不会在RaisePropertychanged上更新

时间:2016-11-04 13:07:11

标签: c# xaml mvvm uwp

使用Mvvm库,UWP,C#。

问题:如果在视图模型中更改了值并且文本框专注于该时刻,则视图不会更新文本框的内容。可以更新没有获得焦点的文本框的viewmodel属性。

清除混淆:文本框 - >有焦点 - >输入的内容 - >被传递给绑定属性 - >属性集,更改值并调用RaisePropertyChange。 - >文本框不会更新。

如果在ViewModel中更改了绑定到不同TextBox的属性,并且使用该属性作为目标调用了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>

我的ViewModel:

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");                               
            }
        }

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

2 个答案:

答案 0 :(得分:0)

尝试删除

updateSourceTrigger=PropertyChanged

来自文本框绑定

viewmodel上的

RaisePropertyChanged 应该足够了

答案 1 :(得分:0)

这是我使用的技巧:

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

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

它就像一种魅力。