2012-11-23 127 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知道也不关心你的类,或者需要在这样的重写类的默认行为的额外工作。