我正在使用2个属性之间的数据绑定(绑定目标是依赖属性)。如果我更改绑定源的值,绑定目标也会更改(依赖属性的值)。我的问题是:我如何处理依赖属性的值变化?
编辑:这是我如何注册我的依赖属性:
public static DependencyProperty ItemsProperty = DependencyProperty.Register(
ItemsPropertyName,
typeof(List<ModelItem>),
typeof(CentralPanel),
new UIPropertyMetadata(null, OnItemsChanged));
因此,当我在OnItemsChanged中放置断点时,该方法只运行一次,当第一次设置binging source的值时。然后,当我更改绑定源的值时,绑定目标的值也会改变,但OnItemsChanged不会触发,为什么?
答案 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;
}