2012-05-17 1 views
1

Вот псевдо-код для того, что я хочу реализовать в XAMLDataTrigger Использования

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. есть способ сделать ELSE, так что я могу указать Gender.Male ресурс только один раз, а не один раз для

Как я могу осуществить это правильно?

Cheers,
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 или внутри модели представления.

В ответ на мой ответ: «Сначала я попытался использовать мультиконвертерный подход с небольшим успехом и почти опубликовал его, чтобы помочь его очистить. Затем я решил, что конвертеры лучше всего использовать для преобразования типов. подход, вероятно, самый простой, но это, похоже, больше похоже на работу вида, и я хотел бы посмотреть, смогу ли я заставить его работать как таковой в первую очередь ».

я сделал попытку [решить это с mutliConveter проводкой здесь] (MultiConverter usage)

ответ

4

Вы должны быть в состоянии сделать это с парой MultiDataTrigger с:

<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 является недействительным и 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 является нулевым, а также Gender женского пола, установите источник «Img_Female»
+0

Да, это то, что я думаю, должно быть исправление. У меня проблема, которую я сделал как [отдельный вопрос здесь] (http://stackoverflow.com/questions/10639274/datatrigger-error). Можете ли вы посмотреть на это? – Berryl

+0

Я полагаю, что нет пути повторения условий для каждого гендерного значения, даже если он всегда будет Img_Male, если он на самом деле не является женщиной, да? Cheers – Berryl

+0

@Berryl это должно быть возможно - см. Мое обновление –

1

В качестве опции можно использовать пользовательский класс преобразования и преобразование ViewModel к источнику растрового. Если вы хотите использовать триггеры, то вы можете использовать несколько мультитатрикеров и/или мультиконвертеры, например, для случаев, когда вы хотите показать Img_Male.

Но эти решения на самом деле не очень хорошие, я думаю, лучше ввести свойство/логику и просто привязать к нему источник изображения и обработать эту логику вида внутри viewmodel. Используя этот подход, вы также можете написать модульные тесты для этой логики.

+0

Я на самом деле пытался multiconverter подход на первый, с скромным успехом, и почти опубликовал это, чтобы помочь очистить его. Затем я решил, что конвертеры лучше всего использовать для преобразования типов. Согласованный подход к модели представления, вероятно, является самым простым, но, похоже, это больше похоже на работу вида, и я хотел бы посмотреть, смогу ли я заставить его работать как таковой в первую очередь. Cheers – Berryl

+0

Идентификация единиц тестирования также проблематична, так как равенство изображения не предоставляется (понятно, так). Cheers – Berryl

+0

Все еще логика приложения позволяет выбирать между некоторыми изображениями и отображать правильные, создается модель просмотра, чтобы накапливать всю логику/свойства вида внутри, и вы можете легко создавать новые представления без копирования вставных триггеров xaml и т. Д. Вы все еще можете свойство единичного тестового пути для растрового изображения в разных логических случаях. Почему вы так боитесь писать эту логику в VM? Btw не ясно понимает предложение о конвертерах, но мультиконвертеры просто выводят одно значение на основе ввода нескольких значений, но не конвертируют тип. – trimeyko