如何设置一个视图模型结合与ReactiveUI一个TextBox?(How to setup a V

2019-09-19 17:46发布

出于某种原因,我不能让我的文本/属性绑定到工作“自动”与无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}" />

Answer 1:

问题是,WP7的TextBox不更新其对KEYUP自动绑定 - 这是每MVVM框架可悲的一个问题。



文章来源: How to setup a ViewModel binding for a TextBox with ReactiveUI?