首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WPF TreeView 資料繫結實作:HierarchicalDataTemplate 與 DataTrigger 樣式完整範例

     編輯:關於.NET

TreeView XAML 完整範例

<TreeView x:Name="TvWorkItem" Grid.Column="0" Grid.Row="2" Background="Black"
          ItemsSource="{Binding MenuDataSource}"
          SelectedItemChanged="TreeView_OnSelectedItemChanged">
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding ChildItems}">
            <TextBlock Text="{Binding Name}" Background="Black">
                <TextBlock.Style>
                    <Style TargetType="TextBlock">
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding HasOutStandingTask}" Value="True">
                                <Setter Property="Foreground" Value="DarkOrange" />
                                <Setter Property="FontSize" Value="16" />
                            </DataTrigger>
                            <DataTrigger Binding="{Binding HasOutStandingTask}" Value="False">
                                <Setter Property="Foreground" Value="Aqua" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </TextBlock.Style>
            </TextBlock>
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

關鍵點解析

  • HierarchicalDataTemplate:專為樹狀結構設計,ItemsSource="{Binding ChildItems}" 自動遞迴呈現子節點。
  • DataTrigger:根據 ViewModel 屬性 HasOutStandingTask 動態切換前景色與字體大小,實現視覺化狀態指示。
  • 資料模型需實作:Name(顯示文字)、ChildItems(子節點集合)、HasOutStandingTask(布林旗標)。

後端綁定資料範例

public class MenuItemViewModel
{
    public string Name { get; set; }
    public bool HasOutStandingTask { get; set; }
    public ObservableCollection<MenuItemViewModel> ChildItems { get; set; }
}

// 在 Window 或 UserControl 建構子中
this.DataContext = new
{
    MenuDataSource = new ObservableCollection<MenuItemViewModel>
    {
        new MenuItemViewModel { Name = "根節點 1", HasOutStandingTask = true, ChildItems = ... },
        new MenuItemViewModel { Name = "根節點 2", HasOutStandingTask = false, ChildItems = ... }
    }
};

常見坑點

  1. 若 ChildItems 為 null 而非空集合,TreeView 仍會嘗試展開導致例外,建議初始化為 new ObservableCollection<T>()。
  2. 大量資料時啟用虛擬化:<TreeView VirtualizingStackPanel.IsVirtualizing="True" />。
  3. 樣式建議提取至 Resources 或 ResourceDictionary 以利複用與維護。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved