Wpf 如果标题在viewmodel中基于布尔值更改,但按钮基于样式资源,如何创建按钮?
也许我遗漏了一些明显的东西,但我无法理解这一点。。。我在App.xml中定义了一种按钮样式,它呈现出“平面”外观的按钮: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}">
<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,谢谢。