微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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的更改可能会导致不同的顺序.

原文地址:https://www.jb51.cc/csharp/97054.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐