1

何らかの理由で、テキストボックス/プロパティバインディングを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}" />
4

1 に答える 1

4

問題は、WP7TextBoxがKeyUpでバインディングを自動的に更新しないことです。これは悲しいことにすべてのMVVMフレームワークの問題です。

于 2012-07-19T08:58:55.780 に答える