如果 IsEnabled 属性为 true,则需要设置 Style 属性,否则不应设置。在我目前看到的示例中,设置了样式属性但未设置样式属性本身。下面的代码不能使用触发器工作。
<TabItem.Style>
<Style TargetType="TabItem">
<Style.Triggers>
<DataTrigger Binding="{Binding IsEnabled}" Value="True">
<Setter Property="Style" Value="DotcomTabItemStyle" />
</DataTrigger>
</Style.Triggers>
</Style>
</TabItem.Style>
Run Code Online (Sandbox Code Playgroud)
由于您通过样式设置触发器,因此更改样式也会删除触发器......不确定是否会解决:P
无论如何,您在Setter(直接设置资源名称,而不是通过静态或动态资源引用)上犯了一个错误。而且你不需要一个DataTrigger. 它应该是:
<Trigger Property="IsEnabled" Value="True">
<Setter Property="Style" Value="{StaticResource DotcomTabItemStyle}" />
</Trigger>
Run Code Online (Sandbox Code Playgroud)
但正如我所说,这可能不会按预期工作,因为您正在尝试从当前样式中修改 Style 属性......
以一种或另一种方式,您最终会为每个属性添加不同的 Setter,可能要么修改DotcomTabItemStyle您已有的样式,要么创建一个新样式(可能基于该样式)。
编辑- 或者您可以使用转换器并将 Style 属性绑定到 IsEnabled 属性。
我为所有这种情况创建了一个可重用的转换器:
public class ConditionalSetterConverter : IValueConverter
{
public bool Inverse { get; set; }
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
bool flag = (bool)value;
if (flag ^ Inverse)
return parameter;
else
return Binding.DoNothing;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
Run Code Online (Sandbox Code Playgroud)
你像这样使用它:
<Window>
<Window.Resources>
<converters:ConditionalSetterConverter x:Key="InverseConditionalSetterConverter"
Inverse="True" />
<Style x:Key="DotcomTabItemStyle" TargetType="TabItem">...</Style>
</Window.Resources>
<TabControl>
<TabItem Style="{Binding IsEnabled,
RelativeSource={RelativeSource Mode=Self},
Converter={StaticResource InverseConditionalSetterConverter},
ConverterParameter={StaticResource DotcomTabItemStyle}}" />
</TabControl>
</Window>
Run Code Online (Sandbox Code Playgroud)
编辑 2 - 或...您可以使用样式选择器。ItemsControls 类似TabControl有一个名为 的属性ItemContainerStyleSelector,类型为StyleSelector。
您必须创建自己的类,继承StyleSelector并覆盖该SelectStyle函数以在其中包含您的自定义逻辑。
像这样的东西:
public class DotcomTabItemStyleEnabledSelector : StyleSelector
{
private Style style = null;
public override System.Windows.Style SelectStyle(object item, System.Windows.DependencyObject container)
{
var tabItem = container as TabItem;
if (tabItem != null && tabItem.IsEnabled)
{
if (style == null)
style = textBox.TryFindResource("DotcomTabItemStyle") as Style;
return style;
}
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
我从来没有使用过样式选择器,所以我不确定这是否可以开箱即用,但至少你明白了。