2012-07-19 63 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

相關問題