【问题标题】:WPF: DependencyProperty of custom control fails when using several instances of the controlWPF:使用控件的多个实例时,自定义控件的 DependencyProperty 失败
【发布时间】:2011-01-27 11:17:04
【问题描述】:

我在 WPF 中构建了一个继承自 ListBox 的自定义控件。在此我实现了我自己的属性,即 BindingList。为了使该属性可绑定,我将其实现为 DependencyProperty:

public BindingList<CheckableListItem> CheckedItems
{
    get
    {
        return (BindingList<CheckableListItem>)GetValue(MultiComboBox.CheckedItemsProperty);
    }
    set
    {
        SetValue(MultiComboBox.CheckedItemsProperty, value);
    }
}
public static readonly DependencyProperty CheckedItemsProperty;

我在自定义控件内的静态构造函数中注册了这个 DependencyProperty:

CheckedItemsProperty = DependencyProperty.Register("CheckedItems",
    typeof(BindingList<CheckableListItem>),
    typeof(MultiComboBox),
    new FrameworkPropertyMetadata(new BindingList<CheckableListItem>()));

(MultiComboBox 是我的自定义控件的名称。CheckableListItem 是我为此目的而编写的一个简单类)。

然后,当用户与之交互时,此 BindingList 在自定义控件内部(永远不会在外部)更新。

当我在 XAML 中使用我的自定义控件时,我使用“OneWayToSource”模式绑定到 CheckItems 属性。我正在使用 MVVM 模式,并且我绑定到的 ViewModel 中的属性也是一个 BindingList。 ViewModel 永远不会影响此列表,它只会对自定义控件对列表所做的更改做出反应。 ViewModel 中的属性如下所示:

private BindingList<CheckableListItem> _selectedItems;
public BindingList<CheckableListItem> SelectedItems
{
    get
    {
        return _selectedItems;
    }
    set
    {
        if (value != _selectedItems)
        {
            if (_selectedItems != null)
            {
                _selectedItems.ListChanged -= SelectedItemsChanged;
            }
            _selectedItems = value;
            if (_selectedItems != null)
            {
                _selectedItems.ListChanged += SelectedItemsChanged;
            }
            OnPropertyChanged("SelectedItems");
        }
    }
}

如您所见,我正在监听对列表所做的更改(这些更改总是发生在我的自定义控件中),并且在“SelectedItemsChanged”方法中我相应地更新了我的模型。

现在...当我的视图中有这些控件之一时,这非常有用。但是,如果我将其中两个(或更多)放在同一个视图中,就会开始发生奇怪的事情。这当然意味着我的 ViewModel 中有两个包含选定项目的列表。但是,如果在视图中执行更改其中一个列表的操作,则两个列表都会受到影响!也就是说,如果对其中任何一个列表进行了更改,则会为这两个列表触发事件 ListChanged 的​​事件处理程序!

有没有人认识到这个问题和/或有解决方案?我的实施有什么问题?

我的第一个想法是 DependencyProperty 是静态的。通常这意味着在所有实例之间共享。但我猜 DependencyProperties 以其他一些“神奇”的方式工作,所以这可能不是问题。

感谢任何提示或提示!

【问题讨论】:

    标签: wpf custom-controls dependency-properties


    【解决方案1】:

    我遇到了与集合类型依赖属性类似的问题。我的解决方案取自 Collection-Type Dependency Properties 上的 MSDN 文章。它正在添加以下行

    SetValue(OperatorsPropertyKey, new List<ListBoxItem>()); //replace key and type
    

    在我的控件的构造函数中,因为无论包含此集合的控件有多少个实例,似乎集合类型的依赖属性构造函数只被调用一次(静态 eh)。

    【讨论】:

      【解决方案2】:

      这听起来像是您将两个/所有视图绑定到同一个 ViewModel。这可以解释对一个的变化会导致另一个的变化。

      【讨论】:

      • 自定义控件的所有实例都在同一个 View 中,因此绑定到同一个 ViewModel。但是它们都绑定到 ViewModel 上的单独属性(BindingLists),所以这应该不是问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-29
      • 1970-01-01
      相关资源
      最近更新 更多