出於某種原因,我無法讓我的文本框/屬性綁定「自動」與Reactive UI一起工作。如何使用ReactiveUI爲TextBox設置ViewModel綁定?
我的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);
正如您可以猜到,我也有密碼確認文本框中/屬性設置,以及爲按鈕設置的命令(密碼確認TextBox具有相同的問題)。由於字段/屬性組合從不在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框架中看到的那樣處理綁定,除非我錯了。有更容易的方法嗎?
UPDATE
正如保羅·貝茨在他回答的評論中指出的,您可以啓用綁定到加入這個屬性來綁定自動更新:
UpdateSourceTrigger=PropertyChanged
這將使文本框元素看起來像這樣:
<TextBox Name="Password" Text="{Binding Password, UpdateSourceTrigger=PropertyChanged}" />
你如何爲你的視圖設置'DataContext'?運行時在VS輸出窗口中是否存在綁定錯誤? – nemesv 2012-07-18 20:29:25
我爲上面的ViewModel/DataContext配置添加了代碼/ xaml。 – 2012-07-19 12:49:00