【问题标题】:Cancelling selection in combobox in wpf using MVVM使用 MVVM 在 wpf 的组合框中取消选择
【发布时间】:2012-12-16 19:40:27
【问题描述】:

我有一个 List 类型的组合框。我通过数据上下文绑定了 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 对象在这种情况下会起作用吗?

【问题讨论】:

  • 那么,究竟是什么不起作用?
  • 在取消点击时保留选择不起作用。即使在取消点击后它也会改变选择。
  • _sel = null , OnPropertyChanged("Sel");或与 selectedindex = -1 相同
  • 关于为什么这不起作用的更多想法?

标签: wpf mvvm combobox


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      创建一个拦截 ComboBox 的 OnChanged 事件并启动消息框的 Behavior。这是using behaviours的教程

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

      【讨论】:

        猜你喜欢
        • 2012-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-20
        • 2018-10-19
        • 2013-03-31
        • 1970-01-01
        相关资源
        最近更新 更多