0

我扩展了 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”类型中找不到属性“存档”

4

3 回答 3

2

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

要在 Achived 属性更改时通知您的视图,您可以:

GX3TreeViewItem1.在您的-class:中实现 INotifyPropertyChanged 接口public class GX3TreeViewItem : TreeViewItem, INotifyPropertyChanged,创建一个引发 PropertyChanged 事件的方法:

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

并将此方法放在您的属性的设置器中:

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

2.或者让你的财产成为一个DependencyProperty

于 2012-11-23T14:57:54.550 回答
0

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

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

这要么不起作用(因为你对你ItemContainerGeneratorTreeView类一无所知,或者需要额外的工作来覆盖此类的默认行为。

于 2012-11-23T15:06:43.243 回答
0

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

你可以做这样的事情,

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

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

于 2012-11-23T15:02:55.277 回答