出于某种原因,我不能让我的文本/属性绑定到工作“自动”与无UI。
我的DataContext的是设置这样的:
我的视图模型是在后面的代码为MainWindow.xaml.cs设置:
public MainWindowViewModel ViewModel { get; protected set; }
public MainWindow()
{
ViewModel = new MainWindowViewModel();
}
在我的WPF MainWindow.xaml我在DataContext和有这样一个文本框元素:
(其它性能ommitted)
<Window x:Name="Window">
<Grid DataContext="{Binding ViewModel, ElementName=Window}">
<StackPanel x:Name="ContentGrid" Grid.Row="1">
<TextBox Name="Password" Text="{Binding Password, Mode=TwoWay}" />
...
在MainWindowViewModel我有一个属性,现场是这样的:
string _PasswordConfirmation;
public string PasswordConfirmation
{
get { return _PasswordConfirmation; }
set { this.RaiseAndSetIfChanged(x => x.PasswordConfirmation, value); }
}
我也有一个命令是设置这样的:
var canHitOk = this.WhenAny(
x => x.Password,
x => x.PasswordConfirmation,
(pass, confirm) => (pass.Value == confirm.Value && pass.Value.Length > 3));
OkCommand = new ReactiveCommand(canHitOk);
正如您可以猜到,我也有密码确认文本/属性设置也和一个按钮(密码确认文本框有同样的问题)的命令集。 由于字段/属性连击将不会在视图模型更新,按钮从未启用。
我调试,并证实该视图模型被绑定到XAML,但文本永远不会在字段/属性连击在文本框输入时更新。
我看着在GitHub库样本WP7应用程序 ,他们手动绑定的KeyUp
事件来设置在属性/字段中的文本。 如果我遵守这个约定,我有这个在我的MainWindow.xaml:
Password.KeyUp += (o, e) =>
{
ViewModel.Password = Password.Text;
};
但是,这是正确的方式做到这一点? 我以为无UI会处理的结合,因为我已经看到了在其他MVVM框架,除非我错了。 有更容易的方法吗?
UPDATE
正如保罗·贝茨在他回答的评论中指出的,您可以启用绑定到加入这个属性来绑定自动更新:
UpdateSourceTrigger=PropertyChanged
这将使TextBox元素是这样的:
<TextBox Name="Password" Text="{Binding Password, UpdateSourceTrigger=PropertyChanged}" />