【问题标题】:How to setup a ViewModel binding for a TextBox with ReactiveUI?如何使用 ReactiveUI 为 TextBox 设置 ViewModel 绑定?
【发布时间】:2012-07-18 17:42:14
【问题描述】:

由于某种原因,我无法让我的文本框/属性绑定“自动”与反应式 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 时,字段/属性组合中的文本永远不会更新。

我查看了sample WP7 application in the GitHub repo,他们手动绑定KeyUp 事件以在属性/字段的文本中设置文本。如果我遵循这个约定,我的 MainWindow.xaml 中有这个:

Password.KeyUp += (o, e) =>
{
    ViewModel.Password = Password.Text;
};

但这是正确的做法吗?我认为 Reactive UI 会像我在其他 MVVM 框架中看到的那样处理绑定,除非我弄错了。有没有更简单的方法?

更新

正如 Paul Betts 在他的回答中的 cmets 中指出的那样,您可以通过将此属性添加到绑定来启用绑定自动更新:

UpdateSourceTrigger=PropertyChanged

这会使 TextBox 元素看起来像这样:

<TextBox Name="Password" Text="{Binding Password, UpdateSourceTrigger=PropertyChanged}" />

【问题讨论】:

  • 如何为您的视图设置DataContext?运行时VS输出窗口是否有绑定错误?
  • 我为上面的 ViewModel/DataContext 配置添加了代码/xaml。

标签: wpf binding mvvm reactiveui


【解决方案1】:

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

【讨论】:

  • 嘿 Paul,谢谢你的回答,但我使用的是 WPF,我只是碰巧看了一下 WP7 的例子,因为它更简单一些。 WPF 是否应该自动更新绑定?
  • 如果您设置 UpdateSourceTrigger = PropertyChanged,WPF 会这样做
  • 太棒了,就是这样!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-22
相关资源
最近更新 更多