c# – 命令DependencyProperties绑定被评估?
什么决定了多个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的更改可能会导致不同的顺序. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |