1

我有一个依赖对象,它定义了一个名为“Renderer”的单一依赖属性。

public class Renderer {
  public string ResourceKey{get; set;}
  public string[] Params{get; set;}
}

public class CellInfo : DependencyObject {
  public static readonly DependencyProperty RendererProperty=
  DependencyProperty.Register("Renderer", typeof(Renderer), typeof(CellInfo), null);

  public Renderer Renderer {
    get { return (Renderer)GetValue(RendererProperty); }
    set { SetValue(RendererProperty, value); }
  }

  public void UpdateRenderer(string resourceKey, params string[] parameters) {
    this.Renderer.ResourceKey = resourceKey;
    this.Renderer.Params = parameters;
    //force refresh - this does not work
    Renderer tmp = this.Renderer;
    this.Renderer = null;
    this.Renderer = tmp;
  }
}

在 XAML 中,我这样声明:

<local: CellInfo x:key="cellInfo" />

再往下,我像这样绑定到它:

 <ControlTemplate x:Key="MyDisplayTemplate" >
    <TextBlock VerticalAlignment="Center" HorizontalAlignment="Stretch"  >
  <TextBlock.Text>
    <MultiBinding Converter="{StaticResource MyConverter}" >
      <Binding Path="Value" />
      <Binding Source="{StaticResource cellInfo}" Path="Renderer"/>
    </MultiBinding>
  </TextBlock.Text>
    </TextBlock>
</ControlTemplate>

上述控件模板用作网格单元格的显示模板。INotifyPropertyChanged 出于性能原因,我想在此处使用依赖对象/属性,因为据我所知,它们确实具有性能和内存资源优势。

我遇到的问题是,当 Renderer 对象的数据发生更改时,要触发单元格的更新。在代码中,我试图绕过这样一个事实,即如果值相同,则依赖属性不会触发更新,方法是首先设置为 null,然后设置回原始属性值。这不起作用。

我唯一能够开始工作的就是让对象实现并在setter中INotifyPropertyChanged触发PropertyChanged事件。CellInfo.Renderer

我的猜测是必须实现INotifyPropertyChange否定 using only 的性能优势,对DependencyObjects吗?在这一点上,如果我被迫实施INotifyPropertyChanged,我什至不扩展DependencyObject,对吗?

感谢您的任何意见。

4

1 回答 1

1

要么换出一个实例Renderer而不是修改现有实例(因此你也可以让它不可变),或者让它扩展DependencyObject并公开依赖属性。

将属性设置为 null 并再次返回不起作用的原因是 WPF 永远不会有机会将属性“视为”为 null。您的代码在调度程序消息中运行,绑定更新将在单独的消息中发生。由于该消息直到您的消息之后才会运行,因此它永远不会看到更改。这里有一种解决方法,即在一条消息中更新为 null,然后在另一条消息中重新设置。但是,您将所有性能提升都很好地、真正地抛到了窗外。更不用说以“正确”的方式来做这件事无论如何都要容易得多。

于 2012-07-19T17:15:10.173 回答