我有一个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,则淡入?
答案 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}" />