c# – 命令DependencyProperties绑定被评估?

前端之家收集整理的这篇文章主要介绍了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的更改可能会导致不同的顺序.

猜你在找的C#相关文章