You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WinUI3 TreeView项状态样式修改:实现灰化禁用效果

解决WinUI3 TreeView灰化禁用的几种方案

方案1:绑定父级ViewModel的布尔值到TreeViewItem

你遇到的核心问题是DataTemplate内的TreeViewItem无法访问父级DataContext,可通过RelativeSource或ElementName实现跨层级绑定。先修正你XAML里的拼写错误(ItemSource应为ItemsSource),再修改布局如下:

<Grid>
    <TreeView x:Name="MyTreeView">
        <TreeView.ItemTemplate>
            <DataTemplate x:DataType="ViewModelObject">
                <TreeViewItem 
                    ItemsSource="{x:Bind Children}" 
                    Content="{x:Bind Name}"
                    IsEnabled="{x:Bind DataContext.IsTreeEnabled, ElementName=MyTreeView}"
                    Foreground="{x:Bind DataContext.IsTreeEnabled, ElementName=MyTreeView, Converter={StaticResource BooleanToBrushConverter}}"/>
            </DataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>
</Grid>

需配合一个布尔转画刷的转换器,代码示例:

public class BooleanToBrushConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        bool isEnabled = (bool)value;
        return isEnabled ? new SolidColorBrush(Colors.Black) : new SolidColorBrush(Colors.Gray);
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}

在页面资源中声明转换器:

<Page.Resources>
    <local:BooleanToBrushConverter x:Key="BooleanToBrushConverter"/>
</Page.Resources>

方案2:直接禁用整个TreeView

如果无需单独控制单个节点,直接给TreeView设置IsEnabled属性即可,WinUI3会自动为整个控件应用灰化的禁用样式,无需额外绑定每个节点:

<Grid>
    <TreeView IsEnabled="{x:Bind IsTreeEnabled}">
        <TreeView.ItemTemplate>
            <DataTemplate x:DataType="ViewModelObject">
                <TreeViewItem ItemsSource="{x:Bind Children}" Content="{x:Bind Name}"/>
            </DataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>
</Grid>

方案3:自定义TreeViewItem样式统一控制外观

若需要更定制化的灰化效果,可修改TreeViewItem的默认样式,在IsEnabled=False时自动切换前景色和交互状态:

<Page.Resources>
    <Style x:Key="CustomTreeViewItemStyle" TargetType="TreeViewItem">
        <Setter Property="Foreground" Value="Black"/>
        <Style.Triggers>
            <Trigger Property="IsEnabled" Value="False">
                <Setter Property="Foreground" Value="Gray"/>
                <Setter Property="PointerCursor" Value="Arrow"/>
            </Trigger>
        </Style.Triggers>
    </Style>
</Page.Resources>

<Grid>
    <TreeView IsEnabled="{x:Bind IsTreeEnabled}">
        <TreeView.ItemTemplate>
            <DataTemplate x:DataType="ViewModelObject">
                <TreeViewItem 
                    Style="{StaticResource CustomTreeViewItemStyle}"
                    ItemsSource="{x:Bind Children}" 
                    Content="{x:Bind Name}"/>
            </DataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>
</Grid>

内容的提问来源于stack exchange,提问作者jhkrum

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 17:42:06