首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同时实现DependencyObject和INotifyPropertyChanged

同时实现DependencyObject和INotifyPropertyChanged
EN

Stack Overflow用户
提问于 2012-07-20 01:08:29
回答 1查看 1.3K关注 0票数 1

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

代码语言:javascript
复制
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中,我这样声明它:

代码语言:javascript
复制
<local: CellInfo x:key="cellInfo" />

再往下看,我就是这样绑定它的:

代码语言:javascript
复制
 <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,然后再设置回原始属性值。这不起作用。

我唯一能做的就是让对象实现INotifyPropertyChanged,并在CellInfo.Renderer setter中触发PropertyChanged事件。

我的猜测是,必须实现INotifyPropertyChange会抵消仅使用DependencyObjects带来的性能优势,对吗?在这一点上,如果我被迫实现INotifyPropertyChanged,我可能甚至不会扩展DependencyObject,对吗?

感谢您的任何意见。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-20 01:15:10

或者换出Renderer的一个实例,而不是修改现有的实例(因此,您也可以将其设置为不可变的),或者让它扩展DependencyObject并公开依赖属性。

将属性设置为null然后再设置回来并不起作用的原因是,WPF从来没有机会将该属性“视为”null。您的代码在dispatcher消息中运行,绑定更新将在单独的消息中发生。因为,该消息直到您的消息之后才会运行,因此它永远看不到更改。这里有一个解决方法,即在一条消息中更新为null,然后在另一条消息中再次将其设置回去。但是这样你就把所有的性能提升都抛到了窗外。更不用说用“正确”的方式去做会变得容易得多。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11565898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档