1

我有一个列表类型的组合框。我通过数据上下文绑定了 ItemsSource 和 ItemSelected。如果所选项目已更改,则我会显示一条确认用户操作的弹出消息。单击“确定”后,选择会更改。但是单击取消时,应取消选择并保留上一个项目。下面是绑定到组合框的 SelectedItem 的属性。

Public SomeClass Sel
{
  get
  {
    return _sel;
  }
  set
  {
    if (_sel != value)
    {
      var sview = _sel;

      if (Compare())
      {
        _sel = value;

        if (Sel != null)
          IsDefault = Sel.IsDefault;
        OnPropertyChanged(() => Sel);
      }
      else
      {
        MessageBoxResult result = MessageBox.Show("Message.", "Owb Message", MessageBoxButton.OKCancel);
        if (result == MessageBoxResult.OK)
        {
          _sel = value;
          if (Sel != null)
            IsDefault = Sel.IsDefault;
          OnPropertyChanged(() => Sel);
        }
        else
        {
          Application.Current.Dispatcher.BeginInvoke(new Action(() =>
          {
            _sel = sview;
            OnPropertyChanged("Sel");
          }), DispatcherPriority.Send, null);
          return;
        }
      }
    }
  }
}

组合框位于弹出窗口中。那么 Dispatcher 对象在这种情况下会起作用吗?

4

3 回答 3

1

我猜选择的值保留,但视图没有正确更新。

看看这篇文章: http: //www.codeproject.com/Articles/407550/The-Perils-of-Canceling-WPF-ComboBox-Selection。基本上,.Net 3.5 中确实存在的少数解决方法在 .Net 4.0 中不再适用。

于 2013-01-02T17:58:15.787 回答
0

作为一般规则,如果您的视图模型中泄漏了视觉控件,那么您将走上一条您不想走的路。

创建一个拦截 ComboBox 的 OnChanged 事件并启动消息框的 Behavior。这是使用行为的教程

这会将所有 UI 逻辑保留在 UI 中,并让您的视图模型来管理数据和验证。

于 2013-01-02T14:20:13.937 回答
0

它现在像魔术一样工作!我错过了在调用调度程序之前设置值。_sel = sview

于 2013-01-03T10:43:58.053 回答