2012-07-19 60 views
1

我有一个依赖对象,它定义了一个名为“Renderer”的依赖属性。实现DependencyObject和INotifyPropertyChanged

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对象的数据发生变化时,我遇到的问题是触发单元格的更新。在代码中,我试图解决这个事实,即如果值是相同的,则依赖属性不会触发更新,通过首先设置为空,然后设置回原始属性值。这不起作用。

我已经能够上班的唯一的事情是也有对象执行INotifyPropertyChanged和解雇PropertyChanged事件CellInfo.Renderer二传手。

我的猜测是必须实施INotifyPropertyChange否定仅使用DependencyObjects的性能好处,是否正确?此时,如果我被迫执行INotifyPropertyChanged,我甚至可能不会延长DependencyObject,对吗?

感谢您的任何意见。

+0

当'class Renderer'变得不可变时,这会更容易。 – 2012-07-19 17:11:28

+0

为什么?并且我的假设是正确的(请参见最后一段) – mike01010 2012-07-19 17:13:58

+1

不可变的值必须一次全部换出并触发通知。 – 2012-07-19 17:19:11

回答

1

Renderer的实例替换掉而不是修改现有实例(因此您可以使其不变),或者将其扩展为DependencyObject并公开依赖属性。

将属性设置为null并返回的原因不起作用是因为WPF永远不会有机会将该属性“视为”空值。您的代码正在调度程序消息中运行,并且绑定更新将在单独的消息中发生。因为,那个消息直到你的消息才会运行,它从来没有看到这个变化。这里有一个解决方法,即在一条消息中将其更新为空,然后再将其置回另一条消息中。但是,你将所有的表现收益都放在了窗外。更不用说,这样做“正确”的方式反而变得容易得多。

+0

谢谢,实施INotifyPropertyChanged确实解决了这个问题......但我的假设是正确的,即如果我这样做,我可能不会扩展DependencyObject,因为没有点(即从使用性能收益必须实现INotifyPropertyChange),DependencyObject被抛出窗口? – mike01010 2012-07-19 17:32:03

+0

@mike:是这样或者那样,是的。在绑定更新方面,扩展DependencyObject可以提高性能。但是,它将您与WPF基础结构联系在一起,并且无法继承其他任何类,所以这是一种折衷。 – 2012-07-19 17:40:19

相关问题