根据扩展属性值设置扩展TreeViewItem的样式

时间:2012-11-23 14:53:47

标签: c# wpf treeview

我扩展了TreeViewItem类,允许我在树视图项中存储额外的数据。我希望能够根据我添加的扩展属性之一的值设置treeview项的样式。

到目前为止,我有:

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

类型中找不到属性'Archived'

3 个答案:

答案 0 :(得分:2)

DataTrigger没有Archived属性,但您可以通过Binding属性将Achived属性绑定到它,如<DataTrigger Binding="{Binding Path=Archived}" Value="True">

要通知您的观看Achived属性是否发生变化,您可以:

1.在GX3TreeViewItem - 类:public class GX3TreeViewItem : TreeViewItem, INotifyPropertyChanged中实现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

答案 1 :(得分:0)

老实说,好像你做错了。这些属性应该在您的数据上。

你可以这样做,

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

GetStyle是一个IValueConverter,无需扩展TreeView imo。

答案 2 :(得分:0)

这不是实现此目的的正确方法。你应该看一下MVVM Pattern

您的用户界面不适合“存储额外数据”。 UI是UI,数据是数据。这是来自winforms或其他非WPF背景的人所犯的最大错误,在WPF中使用错误的方法和错误的心态。

这将不起作用(因为ItemContainerGenerator的{​​{1}}对您的课程一无所知,或者需要额外的工作来覆盖此类的默认行为。