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
相关产品推荐
相关产品推荐

