从ViewModel取消编辑事件

时间:2012-06-13 15:31:04

标签: wpf mvvm

相当新手的问题,我敢肯定,但我无法找到答案...... 我有一个控件(在本例中是一个组合框),它绑定到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");
    }
}

1 个答案:

答案 0 :(得分:0)

因为您要在文本更改事件的范围内取消,所以wpf会忽略属性更改事件。您必须从调度员

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

您应该保留现有的“OnPropertyChanged(”名称“);”在函数的底部只需将上面的行添加到要取消的块

编辑:以下代码可以正常测试

        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");
                    });
                }
            }
        }