文本框绑定没有更新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");
}
}
这就好像有焦点的文本框只要有焦点就不会更新它的内容。
尝试删除
updateSourceTrigger=PropertyChanged
从你的文本框绑定
RaisePropertyChanged在视图模型上应该足够
我用了一个小技巧:
不调用RaisePropertyChanged(),而是调用以下方法:
public async void ForceRaisePropertyChanged(string propName)
{
await Task.Delay(1);
RaisePropertyChanged(propName);
}
效果很好