2014-02-06 49 views
0

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

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

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

所以,当我把断点OnItemsChanged,该方法只运行一次,如果暴饮暴食源的值设置为第一次。然后,当我更改绑定源的值时,绑定目标的值也会改变,但OnItemsChanged不会触发,为什么?

+0

当你说_I改变source_你绑定的值更改列表中的整个列表或项目? – dkozl

+0

@dkozl:我改变了整个列表。它有什么区别? –

+0

'OnItemsChanged'只有当您将其设置为'List '的不同实例时才会触发。它不会触发,如果它将是列表添加或删除列表中的项目相同的列表 – dkozl

回答

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; 
} 
+0

我是否可以帮助... –

+0

如何订阅CollectionChanged事件?即使在现在,当对象的新实例被设置为一个值并且我将绑定源和目标更改为ObservableCollection而不是List时,捕获更改(OnItemChanged中的断点)方法的标准方法也不起作用。 –

+0

当您使用ObservableCollection时,您只会继续使用一个实例,并在添加/删除项目时通知用户界面。所以当你做'var myList = new ObservableCollection (); myList.CollectionChanged + = MyCollectionChangedCallback;'每次当你添加/删除你的集合中的物品时,它会调用'MyCollectionChangedCallback' – dkozl

0

每个网格视图都有一组在网格视图的.aspx定义中定义的事件函数,并且它们在页面的aspx.cs后面的代码中进行了控制。事件的

EventArgs的参数包含某个属性的价值的两种定义:e.NewValues [“属性名”]。此属性可帮助您处理您的依赖属性的更改值。

问候, ANDOURA

+0

是的,没错。但问题是,OnItemsChanged,我可以检查e的值,只运行一次。因此它将e.NewValue显示为一个值,将e.OldValue显示为null。我相信,当它运行下一次,它将覆盖的OldValue,但问题是,这种情况下只运行一次:) –

+0

尝试使用以下甚至** ** OnItemsSourceChanged: '公共静态只读的DependencyProperty ItemsSourceProperty 新的PropertyProxy.Register(“ItemsSource”,typeof(IEnumerable),typeof(ItemsControl), new FrameworkPropertyMetadata((IEnumerable)null, new PropertyChangedCallback(OnItemsSourceChanged))); 私有静态无效** ** OnItemsSourceChanged(DependencyObject的d,DependencyPropertyChangedEventArgs E)' { ** e.Old **和** ** e.New} 让 – Ando