如何根据wpf (mvvm)中的bool切换边框的样式

本文关键字:bool 边框 样式 中的 何根 wpf mvvm | 更新日期: 2023-09-27 18:16:42

那么这是我在xaml

中的边框的一部分
    <DataTemplate DataType="{x:Type viewModel:FunctionProviderViewModel}">
    <Border Margin="4"
            Background="PapayaWhip"
            CornerRadius="4"                
            IsEnabled="{Binding IsSimpleModeActive}"
            Style="{StaticResource ResourceKey=AcpBorder}">     

我正在用这个数据模板填充控件。我添加了另一个边界与x:Key="SimpleAcpBorder",我添加了一个bool到我的视图模型(这将被绑定到一个复选框)。现在我想把样式设置为简单,如果复选框被选中和常规的其他。有人知道怎么做吗?

提前感谢!

编辑:

我的数据模板现在看起来像这样

    <DataTemplate DataType="{x:Type viewModel:FunctionProviderViewModel}">
    <Border Background="PapayaWhip">
        <Border.Style>
            <Style TargetType="Border"                       
                   BasedOn="{StaticResource ResourceKey=AcpBorder}">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding IsSimpleModeActive}"
                                 Value="True">
                        <Setter Property="Margin"
                                Value="0" />
                        <Setter Property="CornerRadius"
                                Value="0" />                            
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Border.Style>
        <Border.Effect>
            <DropShadowEffect BlurRadius="10" ShadowDepth="5" />
        </Border.Effect>
        <TreeViewItem VerticalContentAlignment="Center"
                      Background="Transparent"

在另一个示例中,我的AcpBoarder保持不变:

    <Style x:Key="AcpBorder"
       TargetType="Border">
    <Setter Property="VerticalAlignment"
            Value="Stretch" />
    <Setter Property="CornerRadius"
            Value="3" />
    <Setter Property="Padding"
            Value="4" />
    <Setter Property="Margin"
            Value="2" />
</Style>

但不知何故,触发器似乎对我不起作用。什么好主意吗?

Thank you very much

EDIT2:

<>之前System.Windows.Data警告:56:Created BindingExpression (hash=54724182) for Binding (hash=28450086)System.Windows.Data警告:58:Path: 'IsSimpleModeActive'System.Windows.Data警告:60:BindingExpression (hash=54724182):默认模式解析为单向System.Windows.Data警告:61:BindingExpression (hash=54724182):默认更新触发器解析为PropertyChangedSystem.Windows.Data: BindingExpression (hash=54724182): Attach to System.Windows.Controls.Border.NoTarget (hash=22755592)System.Windows.Data警告:67:BindingExpression (hash=54724182):解析源System.Windows.Data警告:70:BindingExpression (hash=54724182): Found data context element: Border (hash=22755592) (OK)System.Windows.Data警告:78:BindingExpression (hash=54724182): Activate with root item FunctionProviderViewModel (hash=3473742)System.Windows.Data警告:107:BindingExpression (hash=54724182):在使用FunctionProviderViewModel的缓存访问器的级别0。IsSimpleModeActive: RuntimePropertyInfo (IsSimpleModeActive)System.Windows.Data警告:104:BindingExpression (hash=54724182):使用accessor RuntimePropertyInfo(IsSimpleModeActive)将级别0的项替换为FunctionProviderViewModel (hash=3473742)System.Windows.Data警告:101:BindingExpression (hash=54724182): GetValue在级别0从FunctionProviderViewModel (hash=3473742)使用RuntimePropertyInfo(IsSimpleModeActive): 'False'System.Windows.Data警告:80:BindingExpression (hash=54724182): TransferValue -获得原始值'False'System.Windows.Data警告:89:BindingExpression (hash=54724182): TransferValue -使用最终值"False"线程"(0x454)"已退出,代码为0 (0x0)。

如何根据wpf (mvvm)中的bool切换边框的样式

您可以使用DataTrigger。但是,您不能将DataTrigger直接应用于您的边界。相反,您必须将其应用于Style

从评论看来,您在许多地方使用AcpBorder样式,并且您不想在此样式和名为IsSimpleModeActive的视图模型属性之间创建耦合。一种方法是直接设置Border.Style属性,并让样式基于AcpBorder样式:

<Border Margin="4" Background="PapayaWhip" CornerRadius="4" IsEnabled="False">
  <Border.Style>
    <Style TargetType="Border" BasedOn="{StaticResource AcpBorder}">
      <Style.Triggers>
        <DataTrigger Binding="{Binding IsSimpleModeActive}" Value="True">
          <Setter Property="IsEnabled" Value="True"/>
          ... more setters
        </DataTrigger>
      </Style.Triggers>
    </Style>
  </Border.Style>
</Border>