什么决定了多个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的更改可能会导致不同的顺序.