何らかの理由で、テキストボックス/プロパティバインディングをReactiveUIで「自動的に」機能させることができません。
私の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にバインドされていることを確認しましたが、TextBoxを入力するときに、フィールド/プロパティの組み合わせでテキストが更新されません。
GitHubリポジトリでサンプルのWP7アプリケーションを確認したところ、イベントを手動でバインドしてKeyUp
、プロパティ/フィールドのテキストにテキストを設定しました。この規則に従うと、MainWindow.xamlに次のようになります。
Password.KeyUp += (o, e) =>
{
ViewModel.Password = Password.Text;
};
しかし、それはそれを行う正しい方法ですか?間違えない限り、他のMVVMフレームワークで見たように、ReactiveUIがバインディングを処理すると思いました。もっと簡単な方法はありますか?
アップデート
Paul Bettsが彼の回答のコメントで指摘したように、このプロパティをバインディングに追加することで、バインディングを自動的に更新できるようにすることができます。
UpdateSourceTrigger=PropertyChanged
これにより、TextBox要素は次のようになります。
<TextBox Name="Password" Text="{Binding Password, UpdateSourceTrigger=PropertyChanged}" />