评估DependencyProperty绑定的顺序

本文关键字:顺序 绑定 DependencyProperty 评估 | 更新日期: 2023-09-27 18:28:08

是什么决定了同一控件上的多个DepdencyProperties的求值顺序?

我正在使用扩展的WPF工具包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 ), 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 );
}

我面临的问题在这个论坛上讨论过,但我提出了一个更普遍的WPF问题,即如何更改这些属性的更新顺序。

我尝试过以不同的顺序多次调用NotifyPropertyChanged,但这似乎并不影响这一点。我可以使订单不同吗?还是应该修改PropertyGrid,使其适用于任一订单?

评估DependencyProperty绑定的顺序

还有一个反例来证实已经说过的话

永远不要依赖于应用的属性顺序

在具有已定义DependencyProperty-ies(.NET 4.5等)的自定义UserControl中,初始化时调用PropertyChangedCallbacks。。。

实际顺序由"代码隐藏定义"(静态字段)的顺序确定

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

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

简单的答案是,这都是一个黑盒,不应该依赖于一个之前或之后的评估。因此,最好的方法是修改PropertyGrid,使其无论属性的设置顺序如何都能正常工作。

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

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

代替:

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

同样,依赖这一点是不好的做法。这种怪癖可能只适用于控件初始化时。稍后对ActiveDataPointDataContext的更改可能会导致不同的顺序。