Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 如果标题在viewmodel中基于布尔值更改,但按钮基于样式资源,如何创建按钮?_Wpf_Mvvm_Wpf Style - Fatal编程技术网

Wpf 如果标题在viewmodel中基于布尔值更改,但按钮基于样式资源,如何创建按钮?

Wpf 如果标题在viewmodel中基于布尔值更改,但按钮基于样式资源,如何创建按钮?,wpf,mvvm,wpf-style,Wpf,Mvvm,Wpf Style,也许我遗漏了一些明显的东西,但我无法理解这一点。。。我在App.xml中定义了一种按钮样式,它呈现出“平面”外观的按钮: <Style x:Key="FlatButton" TargetType="{x:Type Button}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type Button}">

也许我遗漏了一些明显的东西,但我无法理解这一点。。。我在App.xml中定义了一种按钮样式,它呈现出“平面”外观的按钮:

<Style x:Key="FlatButton" TargetType="{x:Type Button}">
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="{x:Type Button}">
        <Border x:Name="ButtonBorder" BorderThickness="2" BorderBrush="{DynamicResource color_Logo}" Padding="5,3,5,3" HorizontalAlignment="Stretch" Background="White">
          <TextBlock x:Name="ButtonText" FontSize="12" Foreground="{DynamicResource color_Logo}" HorizontalAlignment="Center" VerticalAlignment="Center"><ContentPresenter /></TextBlock>
        </Border>
        <ControlTemplate.Triggers>
          <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="TextBlock.FontWeight" Value="Bold" />
          </Trigger>
          <Trigger Property="IsEnabled" Value="False">
            <Setter Property="BorderBrush" Value="Gray" TargetName="ButtonBorder" />
            <Setter Property="Foreground" Value="Gray" TargetName="ButtonText" />
          </Trigger>
          <Trigger Property="IsPressed" Value="True">
            <Setter Property="Background" Value="{DynamicResource color_LogoLight}" TargetName="ButtonBorder"/>
          </Trigger>
        </ControlTemplate.Triggers>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>          

在我的整个应用程序中工作得非常好。我现在需要创建一个具有这种样式的按钮,但是按钮的内容或标题会根据viewmodel中布尔值的状态而更改。我尝试了几次迭代,结果要么编译器抱怨已经设置了style属性,要么我只看到对象类型名称作为标题

我想我可以在viewmodel中创建一个文本属性来公开正确的标题,但这似乎违反了MVVM中关注点的分离。虽然我知道如果我这样做的话,这不是一种可以逮捕的冒犯,但我的viewmodel不应该关心UI呈现内容的方式,对吗?它只是公开对象的状态,UI决定如何显示它

另一个选项是根据viewmodel布尔值创建两个按钮并隐藏不合适的按钮。这似乎更符合MVVM模式,但我觉得我应该能够通过一个按钮上的触发器来实现这一点

是否可以覆盖部分样式资源

目前,我采用的是双按钮解决方案,但我只想知道我遗漏了什么

谢谢

J

是否可以覆盖部分样式资源

不可以。您确实可以将一个样式基于另一个样式并覆盖specfic设置器,但不能仅“覆盖”ControlTemplate的一部分。不幸的是,您必须(重新)将整个模板定义为一个整体:

我想我可以在viewmodel中创建一个文本属性来公开正确的标题,但这似乎违反了MVVM中关注点的分离

嗯,一点也不。视图模型的名称本身就意味着它是视图的模型。当然,这取决于一些设计选择,但在我看来,这并不违反MVVM

除此之外,我将使用DataTrigger(在
Style.Triggers
中定义),您可以在其中设置特定的、仅查看给定布尔属性值的字符串


而且,请不要使用两个按钮的解决方案,这更接近于可逮捕的罪行;o)

将按钮的文本属性绑定到业务数据中的布尔值,然后使用IValueConverter移交适当的文本。您的按钮(和按钮样式)应该没有用于动态设置文本的业务逻辑,这是基于按钮之外的一些问题。正如Bubba所说,您可以在button元素处绑定文本,并通过转换器运行它。这样您就可以重用按钮样式。例如:
谢谢大家的支持,各位。。。至少我知道我不只是缺少XML。谢谢,@mm8。谢谢你的反馈和链接。我想我明白你的意思了,@heltonbiker,谢谢。