使用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");
}
}
就好像具有焦点的文本框只要具有焦点就不会更新它的内容。
答案 0 :(得分:0)
尝试删除
updateSourceTrigger=PropertyChanged
来自文本框绑定
viewmodel上的RaisePropertyChanged 应该足够了
答案 1 :(得分:0)
这是我使用的技巧:
不是调用RaisePropertyChanged(),而是调用以下方法:
public async void ForceRaisePropertyChanged(string propName)
{
await Task.Delay(1);
RaisePropertyChanged(propName);
}
它就像一种魅力。