[英]Set style of extended TreeViewItem based on an extended property value
我扩展了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类型中找不到属性'已存档'
DataTrigger没有Archived属性,但您可以通过Binding属性将<DataTrigger Binding="{Binding Path=Archived}" Value="True">
属性绑定到它,如此<DataTrigger Binding="{Binding Path=Archived}" Value="True">
要通知您的观点,Achived属性是否发生变化,您可以:
1.在GX3TreeViewItem
-class中实现INotifyPropertyChanged接口: 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
。
老实说,你似乎做错了。 这些属性应该在您的数据上。
你可以这样做,
Style="{Binding Path=Archived, Converter={StaticResource GetStyle}}"
GetStyle是一个IValueConverter,无需扩展TreeView imo。
这不是实现此目的的正确方法。 你应该看看MVVM模式 。
您的UI不是“存储额外数据”的适当位置。 UI是UI,数据是数据。 这是来自winforms或其他非WPF背景的人所犯的最大错误,在WPF中使用错误的方法和错误的心态。
这将无效(因为TreeView
的ItemContainerGenerator
对您的类一无所知,或者需要额外的工作来覆盖此类的默认行为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.