C# WPF:DataTemplate样式仅在命令可以执行时应用

C# WPF:DataTemplate样式仅在命令可以执行时应用,c#,wpf,mvvm,C#,Wpf,Mvvm,在我的MVVM冒险中,另一个奇怪的行为我无法解释,也找不到理由: 我的VM中有一个命令,在选择颜色时可以执行该命令: public ICommand SetSingleColor { get { return new RelayCommand(f => { var visualLed = f as VisualLed; visual

在我的MVVM冒险中,另一个奇怪的行为我无法解释,也找不到理由: 我的VM中有一个命令,在选择颜色时可以执行该命令:

    public ICommand SetSingleColor
    {
        get
        {
            return new RelayCommand(f =>
            {
                var visualLed = f as VisualLed;
                visualLed.Color = SelectedColor.Value;
            }, () => SelectedColor.HasValue);
        }
    }
我的数据模板如下所示:

<DataTemplate DataType="{x:Type ml:VisualLed}" x:Key="DtVisualLed">
    <Button 
        Background="DarkCyan"
        Command="{Binding Path=DataContext.SetSingleColor, RelativeSource={RelativeSource AncestorType=v:LedDesignView}}" 
        CommandParameter="{Binding}"
        Style="{StaticResource StyleBtnLed}">
    </Button>
</DataTemplate>

正如您所看到的,我将可视化本身传递回VM,以便设置颜色。我只是为了测试目的添加了Background属性。 我真正不明白的是:只有在命令可以执行的情况下,才会应用样式和背景!因此,如果我加载视图,按钮背景是默认的灰色,一旦我选择了一种颜色,它就会变成深色


不幸的是,我不能提供更多信息,但我没有找到关于ButtonBase.Command如何影响其他属性的主题的任何内容。这似乎也是一种预期的行为,因为我没有收到任何绑定错误之类的信息。

Button.Command和Button.IsEnabled属性之间存在关系。如果Command.CanExecute返回false,则按钮将被禁用。现在,如果ControlDeveloper没有计划,您通常无法用自己的风格控制一切。在这种情况下,禁用的按钮背景由按钮的开发人员修复,您不能用自己的样式覆盖它(除非更改按钮的模板)

在选择颜色之前,按钮是否已禁用?你能点击它吗?是的,它是禁用的,直到我选择一种颜色。这是预期的,也是我想要的,但我不明白为什么在那之前不应用样式,因为我看不到样式/背景和命令之间有任何直接的关联。嗯,你完全正确。我没有得到的是:我可以覆盖按钮上的样式,这些按钮是启用的,但当它被禁用时,我不能覆盖,然后我必须覆盖整个DataTemplate。这种区别是如何实现的?基本上是由Button类的开发人员完成的。例如,他可以公开DisabledBackground属性,然后在模板中将其用于DisableButton,但并没有。相反,他以某种方式在他的模板中硬编码了这个值,这就是为什么你必须覆盖整个模板来修复这个问题。有趣的东西,我将不得不覆盖整个模板,然后真的。