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 = ... }
}
};
常見坑點
- 若
ChildItems 為 null 而非空集合,TreeView 仍會嘗試展開導致例外,建議初始化為 new ObservableCollection<T>()。
- 大量資料時啟用虛擬化:
<TreeView VirtualizingStackPanel.IsVirtualizing="True" />。
- 樣式建議提取至
Resources 或 ResourceDictionary 以利複用與維護。