1

かなり初心者の質問だと思いますが、答えを見つけることができませんでした...
ViewModel プロパティにバインドされたコントロール (この場合はコンボ ボックス) があります。

<ComboBox 
      x:Name="methodTypeCmb"
      Grid.Row="0" Grid.Column="2" 
      ItemsSource="{Binding Path=AllNames, Mode=OneTime}"
      SelectedItem="{Binding Path=Name, ValidatesOnDataErrors=True, Mode=TwoWay}"
      Validation.ErrorTemplate="{x:Null}"
      />

私の ViewModel では、このプロパティが変更されたときに、ユーザーに変更の確認を求めたいと考えています。
ユーザーが「いいえ」をクリックした場合、変更をキャンセルしたい。
ただし、変更がキャンセルされたときにビューが以前の値に戻らないため、何か間違ったことをしているに違いありません。

ViewModel のプロパティ:

public string Name
{
    get { return m_model.Name; }
    set
    {
        if (MessageBox.Show("Are you absolutely sure?","Change ",MessageBoxButton.YesNo) == MessageBoxResult.Yes)
        {
            // change name
        }
        base.OnPropertyChanged("Name");
    }
}
4

1 に答える 1

1

テキスト変更イベントのスコープ内でキャンセルするため、wpfはプロパティ変更イベントを無視します。コーディネーターから呼び出す必要があります

        Dispatcher.CurrentDispatcher.BeginInvoke((ThreadStart)delegate
        {
            OnPropertyChanged("Name");
        });

既存の"OnPropertyChanged(" Name ");"を残す必要があります 関数の下部で、キャンセルするブロックに上記の行を追加するだけです

編集:次のコードは私がテストしたものです

        public string Newtext
        {
            get
            {
                return this._newtext;
            }
            set
            {
                if (MessageBox.Show("Apply?", "", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
                {
                    this._newtext = value;
                    this.OnPropertyChanged("Newtext"); //Ignored
                }
                else
                {
                    Dispatcher.CurrentDispatcher.Invoke((ThreadStart)delegate
                    {
                        OnPropertyChanged("Newtext");
                    });
                }
            }
        }
于 2012-06-13T17:04:10.590 に答える