【问题标题】:Using MVVM how can I find out if a ComboBox has changed the selected value?使用 MVVM 如何确定 ComboBox 是否更改了所选值?
【发布时间】:2010-10-03 21:07:23
【问题描述】:

我有一个包含 2 个组合框的视图(称它们为 ParentTypeCombo 和 ChildTypeCombo)。这两个组合框都有相同的后备下拉列表(称为 WorkItemTypes)。

使用 MVVM 我如何知道这些组合框的值何时更改?我已将它们绑定到属性(称它们为 ParentType 和 ChildType)。但我记得,WPF 不会调用我的 setter。

我不想只关闭组合框上的事件,因为它会出现在后面的代码中,而不是视图模型中。

(我看到example 使用了 ObservableCollection。但我承认我不理解它。我使用了一个名为 CollectionViewSource 的值,它没有解释它是什么或从哪里获得的。)

【问题讨论】:

    标签: wpf events data-binding mvvm


    【解决方案1】:

    只需将 SelectedItem 绑定到 ViewModel 中的父子属性的属性

    <ComboBox SelectedItem="{Binding ParentSelectedItem}" ... />
    

    // 虚拟机

    public WorkItemType ParentSelectedItem
    {
        get { return _parentSelectedItem; }
        set
        {
            if(value != _parentSelectedItem)
            {
                //HERE you know it has changed value.
                _parentSelectedItem = value;
                RaisePropertyChanged("ParentSelectedItem");
            }
        }
      }
    

    您也可以在视图模型上只有一个集合并将它们绑定到两个组合框。

    【讨论】:

    • 当 WPF 更改值时,它会调用我的设置器吗?我不这么认为。 (但我不是 100% 绑定)
    • 是的,默认绑定是两种方式,所以它会调用setter。用一个简单的应用试试,你会看到
    【解决方案2】:

    将 ComboBox IsSyncronyzedWithCurrentItem 属性设置为 true,而不是在您的 vm 上调用此 CollectionViewSource.GetDefualtView([your workitem types]),返回类型为 ICollectionView 或类似的东西,并且它具有当前更改的事件。

    【讨论】:

    • 这是否适用于支持两个 ComboBox 的一个集合 (WorkitemTypes)?
    猜你喜欢
    • 1970-01-01
    • 2012-08-01
    • 2020-01-20
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多