2012-11-23 157 views
0

我已經擴展TreeViewItem類以允許我在樹視圖項目中存儲額外的數據。我希望能夠根據我添加的其中一個擴展屬性的值來設置樹視圖項目的樣式。基於擴展屬性值設置擴展TreeViewItem的樣式

到目前爲止,我有:

namespace GX3GUIControls 
{ 
    public class GX3TreeViewItem : TreeViewItem 
    { 

     public bool Archived { get; set; } 
     public object Value { get; set; } 
    } 
} 

<src:GX3ClientPlugin.Resources> 
     <Style TargetType="{x:Type Controls:GX3TreeViewItem}"> 
      <Style.Triggers> 
       <DataTrigger Archived="True"> 
        <Setter Property="Background" Value="Gray" /> 
        <Setter Property="FontStyle" Value="Italic" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </src:GX3ClientPlugin.Resources> 

但我得到的錯誤 - 錯誤1「已歸檔」酒店式未找到「DataTrigger

回答

2

DataTrigger沒有存檔屬性,但可以綁定通過像這樣<DataTrigger Binding="{Binding Path=Archived}" Value="True">

綁定屬性您Achived屬性來它要通知你的看法,如果Achived屬性的變化,你既可以:

1.Implement INotifyPropertyChanged接口在GX3TreeViewItem -class:public class GX3TreeViewItem : TreeViewItem, INotifyPropertyChanged,創造出引發PropertyChanged事件的方法:

private void PropertyChanged(string prop) 
{ 
    if(PropertyChanged != null) 
    { 
     PropertyChanged(this, new PropertyChangedEventArgs(prop); 
    } 
} 

,並把這種方法在你的setter方法:

private bool _achived; 
public bool Achived 
{ 
    get 
    { 
     return _achived; 
    } 
    set 
    { 
     _achived = value; 
     PropertyChanged("Achived"); 
    } 
} 

2或者讓你的財產成爲DependencyProperty

0

老實說,你好像做錯了。這些屬性應該在你的數據上。

你可以做這樣的事情,

Style="{Binding Path=Archived, Converter={StaticResource GetStyle}}" 

GetStyle爲是的IValueConverter,沒有必要擴大海事組織樹視圖。

0

這不是實現此目的的正確方法。你應該看看MVVM Pattern

您的用戶界面不是「存儲額外數據」的適當位置。 UI是UI,數據是數據。這是來自Winforms或其他非WPF背景的人員犯的最糟糕的錯誤,在WPF中使用了錯誤的方法和錯誤的思維方式。

這將要麼不工作(因爲TreeViewItemContainerGenerator知道也不關心你的類,或者需要在這樣的重寫類的默認行爲的額外工作。