2015-10-30 4 views
0

У меня есть ListBox, с некоторыми ListItems внутри. Все элементы ListItems наследуются от моего BaseViewModel (с использованием MVVM)Как исчезать в ListItem, если ListItem имеет определенный тип

Что я хотел бы сделать, если ListItem имеет тип DogViewModel (который наследует BaseViewModel), а затем для того, чтобы ListItem исчезал. Если LIstItem типа CatViewModel, то он не будет иметь специальных эффектов.

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

Приведенный ниже код не компилируется, но я надеюсь, что это покажет, что я пытаюсь добиться (и то, что я пробовал)

<ListBox.ItemTemplate> 
    <DataTemplate> 
     <DataTemplate.Triggers> 
      <DataTrigger Binding="{Binding Group}" Value="{x:Type vm:DogVm}"> 
       <DataTrigger.EnterActions> 
        <BeginStoryboard> 
         <Storyboard> 
          <DoubleAnimation Storyboard.TargetProperty="Opacity" From="0.0" To="1.0" Duration="0:0:0.2" /> 
         </Storyboard> 
        </BeginStoryboard> 
       </DataTrigger.EnterActions> 
      </DataTrigger> 
     </DataTemplate.Triggers> 
    </DataTemplate> 
</ListBox.ItemTemplate> 

Проблема с выше, он полностью удаляет мой ListItem (или делает его невидимым, не уверен, какой)

Я указываю в том, что только в XAML, если элемент, который только что был добавлен в ObseravableCollection, равен N, затем исчезает?

+0

Обратите внимание, только потому, что я оживляющий Собаку теперь не означает, что я не буду давать равное обращение с Кошкой позже, поэтому любители кошек, пожалуйста, оставайтесь спокойными – MyDaftQuestions

ответ

0

Я думаю, что DataTrigger вместо EventTrigger более подходит, и вам нужно использовать x: Введите, чтобы связать данные с Элементом.

Редактировать: Я ответил на ваш вопрос, исходя из вашего первоначального сообщения. Теперь, учитывая ваш текущий код, я предлагаю использовать конвертер.

Здесь я выбрал пункт ItemTemplate для кнопки.

<Window.Resources> 
    <d:ObjectToTypeConverter x:Key="convertToType" /> 
</Window.Resources> 

<ListBox.ItemTemplate> 
    <DataTemplate> 
     <Button x:Name="btn" Content="{Binding Name}"></Button> 
     <DataTemplate.Triggers> 
      <DataTrigger 
       Binding="{Binding Converter={StaticResource convertToType}}" Value="{x:Type d:DogVm}"> 
        <Setter TargetName="btn" Property="Background" Value="Red"/> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding Converter={StaticResource convertToType}}" Value="{x:Type d:CatVm}"> 
       <Setter TargetName="btn" Property="Background" Value="Yellow"/> 
      </DataTrigger> 
     </DataTemplate.Triggers> 
    </DataTemplate> 
</ListBox.ItemTemplate> 

и вот преобразователь ...

public class ObjectToTypeConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return value.GetType(); 
    } 
     ..... 
} 
0

Вы должны использовать DataTemplateSelector. Вот реализация:

<Window.Resources> 
    <DataTemplate x:Key="FirstTemplate"> 
     <TextBlock Text="{Binding Path=YourProperty}"/> 
    </DataTemplate> 
    <DataTemplate x:Key="SecondTemplate"> 
     <TextBlock Text="{Binding Path=YourProperty}" Background="Red"/> 
    </DataTemplate> 
</Window.Resources> 

и DataTemplateSelector:

public class ViewModelDataTemplateSelector : DataTemplateSelector 
{ 
    public override DataTemplate SelectTemplate(object item, DependencyObject container) 
    { 
     FrameworkElement element; 
     //System.Data.DataRowView viewModelItem; 
     element = container as FrameworkElement; 
     // Tests to ensure that both the item and the container are not null, and that the 
     // item is of the expected data type. 
     if (element != null && item != null && item is System.Data.DataRowView) 
     {     
      // Returns the FirstTemplate in the case of a match 
      if (item is PersonViewModel) 
       return element.FindResource("FirstTemplate") as DataTemplate; 
      else 
       // Returns the SecondTemplate for other cases 
       return element.FindResource("SecondTemplate") as DataTemplate; 
     } 
     return null; 
    } 
} 

<Window x:Class="MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:my="clr-namespace:WpfApplication1" 
    Title="MainWindow" Height="350" Width="525" > 
<Window.Resources> 
    <my:ViewModelDataTemplateSelector x:Key="myTemplateSelector" /> 
</Window.Resources> 
<!-- The code omitted for brevity --> 
</Window> 

и выбрать DataTemplateSelector вы должны использовать его в ListBox:

<ListBox ItemTemplateSelector="{StaticResource myTemplateSelector}" /> 
Смежные вопросы