使用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");
}
}
这是因为如果有焦点不会更新它的内容,只要它具有文本框焦点。
缺乏明确的先例太多的代名词!我不明白你的问题描述。请更精确一些,以便完全清楚执行哪些用户操作,什么_exactly_发生,以及您期望的结果。我无法从帖子中看出,当视图模型以某种方式更改时视图未更新,或者在视图以某种方式更改时未更新视图模型或其他内容时,您是否遇到问题。也不清楚为什么a)通过添加连字符来修改输入,以及b)为什么要在Item1设置器中设置_item2。 –
我认为这种行为是有意为之的,如果您在文本框中输入内容,并且在viewmodel属性发生更改时突然改变其值,则会非常烦人。 –
@PeterDuniho问题出现之后,它表示:如果视图模型中的值发生更改,并且该文本框的焦点位于该时刻,则视图将不更新文本框的内容。如果在视图模型中绑定的值发生更改,并且调用raisepropertychanged,则文本框中的值不会更新。 – Bolke