出于某种原因,我无法让我的文本框/属性绑定与 Reactive UI “自动”一起工作。
我的 DataContext 设置如下:
我的 ViewModel 是在 MainWindow.xaml.cs 后面的代码中设置的:
public MainWindowViewModel ViewModel { get; protected set; }
public MainWindow()
{
ViewModel = new MainWindowViewModel();
}
在我的 WPF MainWindow.xaml 中,我有 DataContext 并且有一个像这样的文本框元素:
(其他属性省略)
<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);
你可以猜到,我也有密码确认文本框/属性设置,以及按钮的命令集(密码确认文本框也有同样的问题)。由于 ViewModel 中的字段/属性组合永远不会更新,因此该按钮永远不会启用。
我调试并确认 ViewModel 已绑定到 XAML,但在 TextBoxes 中键入时,文本永远不会在字段/属性组合中更新。
我查看了 GitHub 存储库中的示例 WP7 应用程序,他们手动绑定KeyUp
事件以在属性/字段的文本中设置文本。如果我遵循这个约定,我的 MainWindow.xaml 中有这个:
Password.KeyUp += (o, e) =>
{
ViewModel.Password = Password.Text;
};
但这是正确的做法吗?我认为 Reactive UI 会像我在其他 MVVM 框架中看到的那样处理绑定,除非我弄错了。有没有更简单的方法?
更新
正如 Paul Betts 在他的回答中的评论中指出的那样,您可以通过将此属性添加到绑定来启用绑定自动更新:
UpdateSourceTrigger=PropertyChanged
这将使 TextBox 元素看起来像这样:
<TextBox Name="Password" Text="{Binding Password, UpdateSourceTrigger=PropertyChanged}" />