簡體   English   中英

根據擴展屬性值設置擴展TreeViewItem的樣式

[英]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中使用錯誤的方法和錯誤的心態。

這將無效(因為TreeViewItemContainerGenerator對您的類一無所知,或者需要額外的工作來覆蓋此類的默認行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM