2012-03-16 33 views
10

什么决定的顺序对同一控制多个DepdencyProperties在得到评估?令,DependencyProperties绑定进行评估?

我使用的Extended WPF Toolkit PropertyGrid中,并同时拥有SelectedObject和PropertyDefinitions约束:

<extToolkit:PropertyGrid AutoGenerateProperties="False" SelectedObject="{Binding ActiveDataPoint}" PropertyDefinitions="{Binding ActiveDataPoint.Properties}"> 

的问题是,从依赖属性的OnSelectedObjectChanged火灾,并在改变处理它引用PropertyDefinitions,它是视为空。如果我注释掉OnSelectedObjectChanged处理程序,然后我可以在调试时OnPropertyDefinitionsChanged被称为呼叫OnSelectedObjectChanged后看到。

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), typeof(PropertyGrid), new UIPropertyMetadata(null, 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,这样它会为任何顺序工作?

回答

9

简短的答案是,它毕竟是一个黑盒子,你不应该依赖于一个之前或之后另一个被评估。所以最好的方法是修改PropertyGrid,使其无论设置属性的顺序如何工作。

长的答案是它看起来像取决于绑定指定的顺序。所以,你可以这样做:

<extToolkit:PropertyGrid AutoGenerateProperties="False" 
    PropertyDefinitions="{Binding ActiveDataPoint.Properties}" 
    SelectedObject="{Binding ActiveDataPoint}" 
    > 

相反的:

<extToolkit:PropertyGrid AutoGenerateProperties="False" 
    SelectedObject="{Binding ActiveDataPoint}" 
    PropertyDefinitions="{Binding ActiveDataPoint.Properties}" 
    > 

再次,这是不好的做法就靠这个。而这个怪癖可能只适用于控制初始化时。以后更改为ActiveDataPointDataContext可能会导致不同的顺序。

8

而且只是多了一个禁忌例子证实了已经被说

...从不依靠施加

在自定义UserControl与定义DependencyProperty属性的顺序上-ies(.NET 4.5等) - 由于PropertyChangedCallbacks在初始化时被调用...

实际的顺序是从“defi后面的代码nitions“(静态字段)

...我猜这与注册顺序有关。

在其他一些情况下,顺序取决于XAML中属性的排列方式。