0

DataContext が割り当てられた WPF ページがあります。このページには、いくつかのテキストボックスがあります。各テキスト ボックスは、DataContext の親オブジェクトのプロパティにバインドされます。たとえば、DataContext には Location オブジェクトがあります。Location オブジェクトには、「Name」や「Address1」などのプロパティがあります。

テキスト ボックス コントロールは次のようにバインドされます。

<Binding Path="Location.Name" Mode="TwoWay">

すべてのデータが有効になると有効になる「コミット」ボタンがあります。これは、プロパティが設定された後のこのプロセスの評価に依存します。これが Location のサブ プロパティでない場合は、次のように簡単に行うことができます。

public Location Location
{
    get { return _location; }
    set
    {
        _location = value;
        OnPropertyChanged("Location");
        OnPropertyChanged("IsCommitEnabled");
    }
}

ただし、Location オブジェクトが実際に設定されることはなく、Location オブジェクトの「Name」プロパティが設定されるため、そのイベントは発生しません。Location オブジェクトのプロパティが変更/設定されたときに、「OnPropertyChanged("IsCommitEnabled")」メソッドを起動する方法はありますか?

4

1 に答える 1

1

ボタンにはClickハンドラーがあり、そのEnabledプロパティはIsCommitEnabledにバインドされていると思います。あなたが有効な状態の更新に責任があることを除いて、これは問題ありません-それはあなたが表現した問題です。
別の方法は、クリックハンドラーと有効なバインディングをコマンドへのバインディングに置き換えることです。コマンドをRoutedCommandとして実装し、CanExecuteRoutedEventArgs.CanExecuteをIsCommitEnableに設定するか、ICommand.CanExecuteがIsCommitEnabledをチェックするICommandの実装を提供できます。
どちらの場合も、フレームワークはCanExecuteメソッドのポーリングを処理するため、プロパティが変更されたときにプロパティの更新を行う必要はありません

RoutedCommandの例:

<Window.CommandBindings>
    <CommandBinding
        Command="{x:Static p:Window1.StartButtonCommand}"
        Executed="buttonStart_Executed"
        CanExecute="CommandBinding_StartButtonEnabled" />
</Window.CommandBindings>

public static RoutedCommand StartButtonCommand = new RoutedCommand();
private void CommandBinding_StartButtonEnabled(object sender, CanExecuteRoutedEventArgs e) {
    e.CanExecute = ....;
}
于 2012-04-22T16:50:21.670 に答える