2016-10-07 49 views
1

我想定义触发器作为资源,稍后在我的控件中使用它们。使用触发器作为资源

像这样:

<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)。但是如何?

注:

请不建议使用样式INSTEAD OF触发器的资源。由于一个控件只能有一个样式,但我需要给几个触发器给一个控件,所以样式在这里没有选择:

在我的实际代码中,我有一个Button,它应该有触发器1,2和4以及一个TextBox那应该有触发器1和3以及一个应该有触发器2,3和4的标签......我想你明白了。

+0

以及如何你要这些触发器添加到您的控件? – Evk

+0

我的意思是你无法将它们添加到控制Triggers集合中,只能添加到DataTemplate,ControlTemplate或Style触发器。 – Evk

+0

@Evk我虽然这样:'' – Kjara

回答

1

你可以做这样的(注意:我如何在前面加上IsEnabledFrameworkElement,也是我如何引用这些资源从风格触发):

<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> 
+0

非常感谢!我无法相信nobode以前曾问过这个问题......而Google也没有帮助过... – Kjara

+0

的确,我其实也并不知道(而且认为)这个,但经过一番研究之后,我已经设法找到它可能如何完成。 – Evk