1

出于某种原因,我无法让我的文本框/属性绑定与 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}" />
4

1 回答 1

4

问题是 WP7 TextBox 不会在 KeyUp 上自动更新其绑定 - 可悲的是,这是每个 MVVM 框架的问题。

于 2012-07-19T08:58:55.780 回答