使用触发器作为资源

7

我想把触发器定义为后续在控件中使用的资源。

就像这样:

<Window.Resources>
    <DataTrigger x:Key="Trigger1" Binding="{Binding ViewModelProperty1}" Value="Val1">
        <Setter Property="IsEnabled" Value="False"/>
    </DataTrigger>
    <DataTrigger x:Key="Trigger2" Binding="{Binding ViewModelProperty2}" Value="Val2">
        <Setter Property="IsEnabled" Value="False"/>
    </DataTrigger>
    ...
</Window.Resources>

然而,当我尝试运行代码时,编译器会抱怨IsEnabled不是一个有效的成员。我认为这是因为它无法知道所讨论的控件是否会有属性“IsEnabled”。与样式一样,我想我需要以某种方式指定TargetType(在我的情况下,应该是FrameworkElement)。但是,如何呢?
注意:
请不要建议将触发器作为资源使用而不是样式。由于控件只能有一个样式,但我需要给一个控件多个触发器,所以这里不适用样式:
实际代码中,我有一个Button,应该有触发器1、2和4,一个TextBox,应该有触发器1和3,还有一个Label应该有触发器2、3和4……我想你懂的。

你打算如何将这些触发器添加到你的控件中? - Evk
我的意思是,无论如何你都不能将它们添加到控件触发器集合中,只能添加到DataTemplate、ControlTemplate或Style触发器中。 - Evk
@Evk 我考虑过这样做:<Button> <Button.Style> <Style> <Style.Triggers> <Trigger Binding="{Binding StaticResource="Trigger1"}"/> <Trigger Binding="{Binding StaticResource="Trigger2"}"/> ... </Style.Triggers> </Style> </Button.Style> </Button> - Kjara
1个回答

11
你可以这样做(注意我如何在FrameworkElement前缀中添加IsEnabled,以及如何从样式触发器引用这些资源):
<Window.Resources>
    <DataTrigger x:Key="Trigger1"
                 Binding="{Binding ViewModelProperty1}"
                 Value="Val1">
        <Setter Property="FrameworkElement.IsEnabled"
                Value="False" />
    </DataTrigger>
    <DataTrigger x:Key="Trigger2"
                 Binding="{Binding ViewModelProperty2}"
                 Value="Val2">
        <Setter Property="FrameworkElement.IsEnabled"
                Value="False" />
    </DataTrigger>
</Window.Resources>
<Button>
    <Button.Style>
        <Style>
            <Style.Triggers>
                <StaticResource ResourceKey="Trigger1" />
                <StaticResource ResourceKey="Trigger2" />
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>

非常感谢!我简直不敢相信没有其他人之前问过这个问题...而且Google也没有帮助... - Kjara
事实上,在此之前我也不知道(也没有想到),但经过一些研究,我已经找到了如何完成它的方法。 - Evk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接