MaterialDesignInXaml主题色切换异常:MenuItem点击Swatch参数为空
问题分析与解决方案
你遇到的空引用异常核心原因很明确:你的ApplyAccentCommand没有收到当前点击的Swatch实例作为参数,导致命令执行时o为null,转换Swatch类型时抛出异常。
为什么参数为空?
你的MenuItem通过ItemsSource绑定到Swatches集合,每个MenuItem的DataContext其实就是集合里对应的单个Swatch对象,但你的Style里只设置了Command,没有指定CommandParameter,所以命令触发时没有传递任何参数,自然就会得到null。
修复步骤
只需要在你的AccentColorMenuItemStyle里添加一个CommandParameter的Setter,绑定到当前MenuItem的DataContext(也就是对应的Swatch)即可:
<Style x:Key="AccentColorMenuItemStyle" BasedOn="{StaticResource MetroMenuItem}" TargetType="{x:Type MenuItem}"> <Setter Property="Command" Value="{Binding DataContext.ApplyAccentCommand, RelativeSource={RelativeSource AncestorType=Window}}" /> <!-- 新增这行,传递当前Swatch作为命令参数 --> <Setter Property="CommandParameter" Value="{Binding}" /> <Setter Property="Header" Value="{Binding Name, Mode=OneWay}" /> <Setter Property="Icon" Value="{StaticResource AccentMenuIcon}" /> </Style>
额外的健壮性优化
为了避免后续类似的意外,建议在ApplyAccent方法里添加空值检查,即使参数为空也不会崩溃:
private static void ApplyAccent(Swatch swatch) { if (swatch == null) return; // 空值保护 new PaletteHelper().ReplaceAccentColor(swatch); }
这样修改后,点击菜单时就能正确传递对应的Swatch实例,命令执行也就不会再抛出空引用异常了。
内容的提问来源于stack exchange,提问作者Steven
相关产品推荐
相关产品推荐

