什么决定了多个DepdencyProperties在同一个控件上的顺序?
我正在使用Extended WPF Toolkit PropertyGrid,并将Selectedobject和PropertyDeFinitions绑定:
<extToolkit:PropertyGrid AutoGenerateProperties="False" Selectedobject="{Binding ActiveDataPoint}" PropertyDeFinitions="{Binding ActiveDataPoint.Properties}">
问题是OnSelectedobjectChanged从依赖关系属性触发,而在该更改的处理程序中,它引用了PropertyDeFinitions,它被视为null.如果我注释掉OnSelectedobjectChanged处理程序,那么在调用OnSelectedobjectChanged之后调用OnPropertyDeFinitionsChanged时,我可以看到它.
public static readonly DependencyProperty PropertyDeFinitionsproperty = DependencyProperty.Register( "PropertyDeFinitions",typeof( PropertyDeFinitionCollection ),typeof( PropertyGrid ),new UIPropertyMetadata( null,OnPropertyDeFinitionsChanged ) ); public PropertyDeFinitionCollection PropertyDeFinitions { get { return ( PropertyDeFinitionCollection )GetValue( PropertyDeFinitionsproperty ); } set { SetValue( PropertyDeFinitionsproperty,value ); } } private static void OnPropertyDeFinitionsChanged(DependencyObject o,DependencyPropertyChangedEventArgs e) { Console.Write("I changed!"); } public static readonly DependencyProperty SelectedobjectProperty = DependencyProperty.Register( "Selectedobject",typeof( object ),OnSelectedobjectChanged ) ); public object Selectedobject { get { return ( object )GetValue( SelectedobjectProperty ); } set { SetValue( SelectedobjectProperty,value ); } } private static void OnSelectedobjectChanged( DependencyObject o,DependencyPropertyChangedEventArgs e ) { PropertyGrid propertyInspector = o as PropertyGrid; if( propertyInspector != null ) propertyInspector.OnSelectedobjectChanged( ( object )e.OldValue,( object )e.NewValue ); }
我正在面对的问题在this forum thread上讨论,但是我提出了一个更一般的WPF问题,我可以如何更改这些属性的更新顺序.
我已经尝试多次调用NotifyPropertyChanged在不同的顺序,但似乎并不影响这一点.我可以使命令有所不同,还是应该修改PropertyGrid,以便它可以用于任何一个命令?
解决方法
简单的答案是,这是一个黑盒子,你不应该依靠一个在另一个之前或之后进行评估.所以最好的方法是修改PropertyGrid,使其工作,而不管属性设置的顺序如何.
长的答案是看起来这取决于绑定的顺序如何指定.所以你可以做:
<extToolkit:PropertyGrid AutoGenerateProperties="False" PropertyDeFinitions="{Binding ActiveDataPoint.Properties}" Selectedobject="{Binding ActiveDataPoint}" >
代替:
<extToolkit:PropertyGrid AutoGenerateProperties="False" Selectedobject="{Binding ActiveDataPoint}" PropertyDeFinitions="{Binding ActiveDataPoint.Properties}" >
再次,依靠这个做法是不好的做法.而这个怪癖只能在控制初始化时起作用.对ActiveDataPoint或DataContext的更改可能会导致不同的顺序.