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 回答