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

WPF/C# MaterialDesign:DataGrid中带徽章按钮PackIcon切换致部分按钮禁用求助

WPF DataGrid中MaterialDesign按钮图标切换异常(仅首个按钮生效)修复方案

问题场景

在WPF项目中使用MaterialDesignInXAML库,在DataGrid的模板列中嵌套带徽章(Badged)的按钮,按钮内容为MaterialDesign PackIcon。尝试通过DataTrigger绑定布尔属性MEPErrorHasErrors切换图标:属性为False时将AlertOutline改为Check,但运行后仅第一个按钮的图标正常切换,其余按钮看似被禁用。

核心原因

你之前的写法中,直接在DataTrigger的Setter里使用{materialDesign:PackIcon Check}创建PackIcon实例,WPF不允许同一个UI元素实例同时存在于多个视觉树中。当DataTrigger触发时,这个唯一的PackIcon实例只会被第一个按钮成功绑定,其余按钮无法获取有效内容,加上按钮样式的影响,看起来就像被禁用了。IsEnabled的绑定本身没有问题,不是导致该现象的原因。

修复方案

推荐通过切换PackIcon的Kind属性来实现图标切换,复用同一个PackIcon控件实例,避免实例共享问题:

<DataGridTemplateColumn Header="Warning">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <materialDesign:Badged x:Name="badgeWarning" 
                                   Badge="{Binding MEPErrorCount, Mode=OneWay}"
                                   Margin="10"
                                   BadgeColorZoneMode="Inverted">
                <Button x:Name="BtnErrorStatus"
                        IsEnabled="{Binding DataContext.ControlsEnabled, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}"
                        Margin="0,-8,-15,0"                                            
                        Style="{StaticResource MaterialDesignFlatDarkButton}"
                        ToolTip="Icon">
                    <!-- 初始设置为AlertOutline的PackIcon -->
                    <materialDesign:PackIcon Kind="AlertOutline"/>
                </Button>
            </materialDesign:Badged>
            <DataTemplate.Triggers>
                <DataTrigger Binding="{Binding Path=MEPErrorHasErrors}" Value="False">
                    <!-- 切换PackIcon的Kind属性而非替换整个Content实例 -->
                    <Setter TargetName="BtnErrorStatus"
                            Property="Content.Kind"
                            Value="Check"/>
                </DataTrigger>
            </DataTemplate.Triggers>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

方案说明

  • 将按钮的Content固定为一个PackIcon控件,初始设置Kind="AlertOutline"
  • 在DataTrigger中通过Content.Kind路径直接修改图标的类型,每个按钮都会拥有独立的PackIcon实例,不会出现视觉树冲突问题
  • 原IsEnabled的绑定逻辑保持不变,无需修改

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 20:42:19