如何根据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)。您可以使用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>