【问题标题】:Order that DependencyProperties bindings are evaluated?评估 DependencyProperties 绑定的顺序?
【发布时间】:2012-03-16 20:52:18
【问题描述】:

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

我正在使用Extended WPF Toolkit PropertyGrid 并绑定了 SelectedObject 和 PropertyDefinitions:

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

问题是 OnSelectedObjectChanged 从依赖属性触发,并且在该更改的处理程序中它引用 PropertyDefinitions,它被视为 null。如果我注释掉 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 以使其适用于任一订单?

【问题讨论】:

    标签: c# wpf xaml dependency-properties wpftoolkit


    【解决方案1】:

    简短的回答是,它完全是一个黑匣子,您不应该依赖一个在另一个之前或之后被评估。因此,最好的方法是修改 PropertyGrid,使其无论属性设置的顺序如何都能正常工作。

    长答案似乎取决于绑定的指定顺序。所以你可以这样做:

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

    代替:

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

    同样,依赖这个是不好的做法。而且这个怪癖可能只在控件初始化时起作用。稍后更改 ActiveDataPointDataContext 可能会导致不同的顺序。

    【讨论】:

      【解决方案2】:

      再举一个反例来确认已经说过的话

      ...从不依赖应用属性的顺序

      在一个自定义的UserControl 中定义了DependencyProperty-ies(.NET 4.5 等)——因为 PropertyChangedCallbacks 在初始化时被调用......

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-24
        • 2018-11-05
        • 1970-01-01
        • 2011-05-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多