2016-10-07 80 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