如何处理依赖属性的值变化?

时间:2014-02-06 10:23:22

标签: c# wpf data-binding

我正在使用2个属性之间的数据绑定(绑定目标是依赖属性)。如果我更改绑定源的值,绑定目标也会更改(依赖属性的值)。我的问题是:我如何处理依赖属性的值变化?

编辑:这是我如何注册我的依赖属性:

public static DependencyProperty ItemsProperty = DependencyProperty.Register(
    ItemsPropertyName,
    typeof(List<ModelItem>),
    typeof(CentralPanel),
    new UIPropertyMetadata(null, OnItemsChanged));

因此,当我在OnItemsChanged中放置断点时,该方法只运行一次,当第一次设置binging source的值时。然后,当我更改绑定源的值时,绑定目标的值也会改变,但OnItemsChanged不会触发,为什么?

2 个答案:

答案 0 :(得分:0)

每个网格视图都有一组在网格视图的.aspx定义中定义的事件函数,它们在页面的aspx.cs后面的代码中得到了保证。

事件的EventArgs e参数包含的定义某个属性的值: e.NewValues [“PropertyName”] 。此属性可帮助您处理您的dependcy属性的更改值。

此致 ANDOURA

答案 1 :(得分:0)

  

我实际上正在清除列表并添加新元素

OnItemsChanged仅在您将其设置为List<ModelItem>的不同实例时才会触发。如果它与您在列表中添加或删除项目的列表相同,则不会触发。

如果您希望列表通知UI在添加/删除项目时发生更改,则必须实现INotifyCollectionChanged界面,或者您可以使用现成的实施ObservableCollection<T>而不是List<T>

如果您想在代码中捕获对集合的更改,您可以订阅CollectionChanged事件

  

在添加,删除,更改,移动项目或刷新整个列表时发生。

您可以在OnItemsChanged回调中执行此操作:

private void OnItemsChanged(DependencyPropertyChangedEventArgs e)
{
   var oldList = e.OldValue as ObservableCollection<ModelItem>;
   if (oldList != null) oldList.CollectionChanged -= MyCollectionChangedCallback;
   var newList = e.NewValue as ObservableCollection<ModelItem>;
   if (newList != null) newList.CollectionChanged += MyCollectionChangedCallback;
}