当前位置: 首页 > 知识库问答 >
问题:

使用MVVM取消wpf中组合框的选择

公羊奇
2023-03-14

我有一个列表类型的组合框。我通过datacontext绑定了ItemsSource和ItemSelected。如果所选项目已经更改,我会显示一条弹出消息,确认用户的操作。单击“确定”后,选择会发生变化。但是在点击“取消”时,选择应该被取消,而先前的项目应该被保留。下面是绑定到combobox的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对象在这种情况下能工作吗?

共有3个答案

鲜于俊侠
2023-03-14

它现在像魔术一样工作!我没有在调用调度员之前设置值_sel=视图

楚天宇
2023-03-14

一般来说,如果视觉控件泄漏到视图模型中,那么你就走上了一条你不想走的路。

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

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

李良策
2023-03-14

我猜选定的值会保留,但视图无法正确更新。

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

 类似资料:
  • 我在后台有< code>ViewModel(实现< code > INotifyPropertyChanged )和类< code>Category,它只有一个< code>string类型的属性。我的ComboBox SelectedItem绑定到类别的实例。当我更改instance的值时,SelectedItem没有更新,Combobox也没有更改。 编辑:代码 组合框: 物业: 我尝试的是:

  • 我有一个ComboBox,我想在视图模型中将选中的项目文本绑定到一个字符串。 现在我有了: Xaml: 视图模型: 当我运行该程序时,我收到异常: Binding表达式路径错误:在“对象”上找不到“类型”属性“观察集合'1'(HashCode=34166919)”。Binding表达式:路径=类型;数据项=“观察集合'1'(HashCode=34166919);目标元素是“组合框”(名称=");目

  • 使用Datagridtemplatecolumn将WPFDatagrid绑定到组合框。很难获得组合框绑定的selectedItem。我发现了类似的例子,但这并不能解决我的问题。 请在下面找到我的 XAML 的代码片段和数据结构: 我在上面定义了一个数据结构,它实现了INotifyPropertychanged接口。 现在,在视图模型中,有一个可观察的X列表集合,即XList,它绑定到XAML中的数

  • 我正在我的 WPF 应用程序中使用 ComboBox 并遵循 MVVM。有一个字符串列表,我想在我的组合框中显示。 XAML: 查看模型: 现在这段代码运行得非常好。我可以从视图中选择,我可以在视图模型中获得更改,如果我从视图模型中更改SelectedItem,我可以在视图中看到它。 这就是我想要达到的目标。当我从我的视图中更改选定的项目时,我需要检查值是好/坏(或任何东西)设置选定的项目,否则不

  • 日安, 我希望我的组合框选择其中的第一个项目。我正在使用C#和WPF。我从DataSet读取数据。要填充组合框: 组合框XAML代码: 如果我尝试: 它不起作用。

  • 背景: 我第一次在项目中使用VueJS,所以我可能没有正确使用它。 我有一个父组件和一个子组件: 父级:ResearchProducts.vue:显示可以按类别筛选的产品列表。筛选器是与产品类别相关的复选框。 子项 : CategoryDisplay.vue :这是处理类别行的视图和方法的组件。 我的问题: 当我单击子组件中的类别复选框时,如果该复选框被选中,该类别将被添加到父组件的过滤器列表中。