2

ボタンのクリックを処理するためにMVVMライトツールキットを使用しています。私が行った場合:

CustomerSaveCommand = new RelayCommand(
    () => CustomerSave(),
    ()=> true);

private void CustomerSave() {
    customer.Address="My Street";
}

関数は呼び出されますが、UI にバインドされている Address フィールドは更新されません。

customer.Address="1234"ViewModel コンストラクターを入れると、UI が更新されます。私は何を間違っていますか?

編集:

問題は本当に奇妙です:viewModel.customer.City = "CITY1"ウィンドウ ロードで実行すると、ボタンを追加し、コード ビハインド クリックで追加すると、viewModel.customer.City = "CITY2"機能しません。

4

2 に答える 2

2

ビューモデルの顧客オブジェクトは、INotifyPropertyChangedインターフェイスを実装する必要があります。

次に、Address プロパティ セッターで、PropertyChanged イベントを呼び出します。

または、viewModel で INotifyPropertyChanged インターフェイスを実装し、Address プロパティをラップして PropertyChanged イベントを呼び出すこともできます。バインディングを更新する必要がありますが、モデル オブジェクトはインターフェイスを実装する必要はありません。

コンストラクターでオブジェクトを変更するとアドレスが表示されるのは、バインドがまだ行われていないためです。UI を更新するには、プロパティ バインディングが変更されたことをバインディング エンジンに指示する必要があります。これを行うには、INotifyPropertyChanged インターフェイスを使用します。

于 2012-09-30T16:00:24.500 に答える
0

このようなことを試してください:

    public class AutoDelegateCommand : RelayCommand, ICommand
{
    public AutoDelegateCommand(Action<object> execute)
        : base(execute)
    {
    }

    public AutoDelegateCommand(Action<object> execute, Predicate<object> canExecute)
        : base(execute, canExecute)
    {
    }

    event EventHandler ICommand.CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }
}
于 2012-09-30T14:57:56.527 に答える