我扩展了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'答案 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}}对您的课程一无所知,或者需要额外的工作来覆盖此类的默认行为。