如果ListItem属于某种类型,如何淡入ListItem

时间:2015-10-30 08:54:03

标签: wpf mvvm

我有一个ListBox,里面有一些ListItems。所有ListItem都继承自我的BaseViewModel(使用MVVM)

我想做的是ListItem是DogViewModel类型(继承BaseViewModel),然后ListItem淡入。如果LIstItem属于CatViewModel类型,那么它将没有&# 39;特'的效果。

最初,所有值都是cat类型,但是用户将类型更改为狗,此时我希望看到原始淡出和新淡入。目前,我&#39 ; m只专注于淡入。

下面的代码无法编译,但我希望它能显示我想要实现的目标(以及我尝试过的内容)

<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,则淡入?

2 个答案:

答案 0 :(得分:0)

我认为DataTrigger而不是EventTrigger更合适,你需要使用x:Type来指定Item的绑定数据。

编辑: 我根据您的原帖回答了您的问题。现在,根据您当前的代码,我建议使用转换器。

在这里,我选择了我的ItemTemplate作为Button。

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="target" style="background-color:blue;">Click me!</div>

这是转换器...

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

答案 1 :(得分: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}" />