2012-05-17 35 views
1

這裏是僞代碼爲我想在XAML實現DataTrigger使用

IF vm.AvatarFilePath IS NOT NULL THEN 
    Image.Source = {Binding AvatarPath} 
ELSE 
    If vm.Gender == {x:Static vm:Gender.Female} THEN 
     Image.Source = {StaticResource Img_Female} 
    ELSE 
     Image.Source = {StaticResource Img_Male} 
    ENDIF 
ENDIF 

以下是一個實現企圖至少以下問題:

  1. 它是如何知道AvatarPath是零,我們關心性別?
  2. 有沒有辦法做別的,所以我只能一次,而不是每一次爲

我怎樣才能正確地實現這個指定Gender.Male資源?

乾杯,
Berryl

XAML嘗試1

<DataTemplate x:Key="AvatarPathTemplate"> 
    <Image x:Name="avatarImage" Source="{Binding AvatarPath}"/> 
    <DataTemplate.Triggers> 
     <DataTrigger Binding="{Binding Gender}" Value="{x:Static vm:Gender.Female}"> 
      <Setter Property="Sourrce" Value="{resx:Resx Img_Female}"/> 
     </DataTrigger> 
     <DataTrigger Binding="{Binding Gender}" Value="{x:Static vm:Gender.Male}"> 
      <Setter Property="Sourrce" Value="{resx:Resx Img_Male}"/> 
     </DataTrigger> 
     <DataTrigger Binding="{Binding Gender}" Value="{x:Static vm:Gender.Unknown}"> 
      <Setter Property="Sourrce" Value="{resx:Resx Img_Male}"/> 
     </DataTrigger> 
     <DataTrigger Binding="{Binding Gender}" Value="{x:Static vm:Gender.Unspecified}"> 
      <Setter Property="Sourrce" Value="{resx:Resx Img_Male}"/> 
     </DataTrigger> 
    </DataTemplate.Triggers> 
</DataTemplate> 

更新

由於trimeyko指出,這可以被要麼多轉換或視圖模型的內部完成。

根據我的回答:「我實際上首先嚐試了multiconverter方法,並取得了一定的成功,並且差不多發佈了這個方法來幫助清理它,然後我決定轉換器最好留待實際轉換類型。的方法可能是最簡單的,但這看起來更像是視圖的工作,我想看看我能否首先將它變成現實。「

我做了我在(MultiConverter usage

回答

4

你應該能夠與一對夫婦的MultiDataTrigger s到這樣做:

<DataTemplate x:Key="AvatarPathTemplate"> 
    <Image x:Name="avatarImage" Source="{Binding AvatarPath}"/> 
    <DataTemplate.Triggers> 
     <MultiDataTrigger> 
      <MultiDataTrigger.Conditions> 
       <Condition Binding="{Binding AvatarPath}" Value="{x:Null}" /> 
       <Condition Binding="{Binding Gender}" Value="{x:Static vm:Gender.Female}"/> 
      </MultiDataTrigger.Conditions> 
      <Setter Property="Source" Value="{resx:Resx Img_Female}"/> 
     </MultiDataTrigger> 

     <MultiDataTrigger> 
      <MultiDataTrigger.Conditions> 
       <Condition Binding="{Binding AvatarPath}" Value="{x:Null}" /> 
       <Condition Binding="{Binding Gender}" Value="{x:Static vm:Gender.Male}"/> 
      </MultiDataTrigger.Conditions> 
      <Setter Property="Source" Value="{resx:Resx Img_Male}"/> 
     </MultiDataTrigger> 
     <!-- etc... --> 
    </DataTemplate.Triggers> 
</DataTemplate> 

這些聲明「時AvatarPath是NULL和Gender是女性...與下面'

進一步完善

作爲DataTrigger s的在順序應用,其中它們出現在XAML,我們可以消除對的複製需要‘男’設置在例如:

<DataTemplate x:Key="AvatarPathTemplate"> 
    <Image x:Name="avatarImage" Source="{Binding AvatarPath}"/> 
    <DataTemplate.Triggers> 
     <DataTrigger Binding="{Binding AvatarPath}" Value="{x:Null}"> 
      <Setter Property="Source" Value="{resx:Resx Img_Male}"/> 
     </DataTrigger> 
     <MultiDataTrigger> 
      <MultiDataTrigger.Conditions> 
       <Condition Binding="{Binding AvatarPath}" Value="{x:Null}" /> 
       <Condition Binding="{Binding Gender}" Value="{x:Static vm:Gender.Female}"/> 
      </MultiDataTrigger.Conditions> 
      <Setter Property="Source" Value="{resx:Resx Img_Female}"/> 
     </MultiDataTrigger> 
    </DataTemplate.Triggers> 
</DataTemplate> 

這裏我們要說:

  1. 將源設置爲AvatarPath
  2. 如果AvatarPath爲空,設置源「Img_Male」
  3. 如果AvatarPath爲null並且Gender是女性,源設置爲「Img_Female」
+0

是的,這是我認爲應該是修復。我有一個問題,我作爲一個[單獨的問題在這裏](http://stackoverflow.com/questions/10639274/datatrigger-error)。你能看看那個嗎? – Berryl

+0

我想,即使它總是Img_Male,除非它實際上是女性,否則是沒有辦法重複每個性別值的條件。乾杯 – Berryl

+0

@Berryl應該有可能 - 看我的更新 –

1

正如你可以使用自定義轉換器類和視圖模型轉換爲位圖源選項[與這裏mutliConveter張貼解決這一]嘗試。 如果你想使用觸發器,那麼你可以使用一些多數據觸發器和/或多變換器,例如當你想顯示Img_Male時。

但是,這些解決方案並不是很好,我認爲,最好引入屬性/邏輯,並簡單地將圖像源綁定到它並處理viewmodel中的這些視圖邏輯。使用這種方法你也可以爲這個邏輯編寫單元測試。

+0

其實,我嘗試了多轉換的做法首先,取得了一定的成功,並且差不多發佈了這個清單來幫助清理它。然後我決定轉換器最好留給實際轉換類型。同意視圖模型方法可能是最簡單的,但這看起來更像是視圖的工作,我想看看我是否能夠首先將其工作。乾杯 – Berryl

+0

單元測試圖像也有問題,因爲沒有提供圖像相等(可以理解)。歡呼 – Berryl

+0

它仍然是應用程序邏輯來選擇一些圖像,並顯示正確的,viewmodel創建積累內部的所有視圖邏輯/屬性,你可以很容易地編碼新視圖,而無需複製粘貼一些xaml觸發器等。 你仍然可以單元測試路徑屬性到位圖在不同的邏輯情況下。爲什麼你害怕在VM中寫這些邏輯? 順便說一句,沒有清楚地瞭解轉換器的句子,但多變換器只輸出一個基於多值輸入的值,但不轉換類型。 – trimeyko