2016-11-04 67 views
-1

使用Mvvm库,UWP,C#。文本框绑定不会在RaisePropertychanged上更新

问题:如果视图模型中的值发生更改,并且该文本框的焦点集中在该时刻,View将不会更新文本框的内容。可以更新未获得焦点的文本框的视图模型属性。

要清除混淆:Textbox - > Has focus - > Something is typed - >传递给绑定属性 - >属性集,更改值并调用RaisePropertyChange。 - >文本框不会更新。

如果绑定到不同文本框的属性在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"); 
      } 
     } 
    } 
} 

如果文本放入文本框的任意一个,一组属性被调用时,值被改变,文本框中的值不会更新。

如果我会打电话TextBox2中的TextBox1中的二传中的PropertyChanged,它将更新:

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

这是因为如果有焦点不会更新它的内容,只要它具有文本框焦点。

+0

缺乏明确的先例太多的代名词!我不明白你的问题描述。请更精确一些,以便完全清楚执行哪些用户操作,什么_exactly_发生,以及您期望的结果。我无法从帖子中看出,当视图模型以某种方式更改时视图未更新,或者在视图以某种方式更改时未更新视图模型或其他内容时,您是否遇到问题。也不清楚为什么a)通过添加连字符来修改输入,以及b)为什么要在Item1设置器中设置_item2。 –

+1

我认为这种行为是有意为之的,如果您在文本框中输入内容,并且在viewmodel属性发生更改时突然改变其值,则会非常烦人。 –

+0

@PeterDuniho问题出现之后,它表示:如果视图模型中的值发生更改,并且该文本框的焦点位于该时刻,则视图将不更新文本框的内容。如果在视图模型中绑定的值发生更改,并且调用raisepropertychanged,则文本框中的值不会更新。 – Bolke

回答

0

尝试从您的文本框结合

RaisePropertyChanged去除

updateSourceTrigger=PropertyChanged 

在视图模型应该足够

+0

不起作用,这将使编辑框在退出时触发raisepropertychange,而不是更改,并且不会更新具有焦点的文本框。 – Bolke