我有一个依赖对象,它定义了一个名为"Renderer“的depedendency属性。
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,然后再设置回原始属性值。这不起作用。
我唯一能做的就是让对象实现INotifyPropertyChanged,并在CellInfo.Renderer setter中触发PropertyChanged事件。
我的猜测是,必须实现INotifyPropertyChange会抵消仅使用DependencyObjects带来的性能优势,对吗?在这一点上,如果我被迫实现INotifyPropertyChanged,我可能甚至不会扩展DependencyObject,对吗?
感谢您的任何意见。
发布于 2012-07-20 01:15:10
或者换出Renderer的一个实例,而不是修改现有的实例(因此,您也可以将其设置为不可变的),或者让它扩展DependencyObject并公开依赖属性。
将属性设置为null然后再设置回来并不起作用的原因是,WPF从来没有机会将该属性“视为”null。您的代码在dispatcher消息中运行,绑定更新将在单独的消息中发生。因为,该消息直到您的消息之后才会运行,因此它永远看不到更改。这里有一个解决方法,即在一条消息中更新为null,然后在另一条消息中再次将其设置回去。但是这样你就把所有的性能提升都抛到了窗外。更不用说用“正确”的方式去做会变得容易得多。
https://stackoverflow.com/questions/11565898
复制相似问题