我正在使用MVVM处理WPF应用程序。
在我的ViewModel中,我有2个ObservableCollection
个对象,我希望以不同的方式显示每个对象。
该集合属于同一类型 - <Record>
。
以下是我展示一个系列的方法:
<ItemsControl ItemsSource="{Binding SquareRecordsToDisplay}" Margin="10,35,10,70.667" >
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid Background="#FFECCCCC">
<TextBlock Text="{Binding Name}" />
<TextBlock Text="{Binding DateString}" Margin="0, 15, 0, 0"/>
<Image Source="{Binding Icon}" Width="20" Height="20" Margin="0, 30, 0, 0"/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style TargetType="ContentPresenter">
<Setter Property="Canvas.Left" Value="{Binding X}"/>
<Setter Property="Canvas.Top" Value="{Binding Y}"/>
</Style>
</ItemsControl.ItemContainerStyle>
</ItemsControl>
有没有办法以不同的方式显示其中的两个,而不使用多个ItemsControl
(即使用两个DataTemplates
)?两者都具有相同的属性,因为它们属于同一类型。我在同一个DataTemplates
中阅读了有关使用两个ItemControl
的类似问题和答案,但他们在查看不同类型的对象时无法解决我的问题。
修改
我尝试使用DataTrigger,但它让我的GUI崩溃......我在这里做错了什么?
<DataTemplate>
<Grid>
<Grid.Triggers>
<DataTrigger Binding="{Binding ViewStyle}" Value="ViewStyle.Square">
<Setter Property="Grid.Background" Value="Grey" />
</DataTrigger>
<DataTrigger Binding="{Binding ViewStyle}" Value="ViewStyle.Round">
<Setter Property="Grid.Background" Value="Aqua" />
</DataTrigger>
</Grid.Triggers>
<TextBlock Text="{Binding Name}" />
<TextBlock Text="{Binding DateString}" Margin="0, 15, 0, 0"/>
<Image Source="{Binding Icon}" Width="20" Height="20" Margin="0, 30, 0, 0"/>
</Grid>
</DataTemplate>
(ViewStyle是一个枚举)
答案 0 :(得分:1)
假设您有一个包含单个字段的简单记录,您希望使用该字段来控制选择哪个模板:
public class MyViewModel : ViewModelBase
{
public Record[] Records {get; set;}
public MyViewModel()
{
this.Records = new Record[] {
new Record{Field = false},
new Record{Field = true},
};
}
}
public class Record
{
public bool Field { get; set; }
}
以下XAML将完成这项工作。它将Item模板设置为一个控件,该控件使用DataTrigger从两种样式中选择一种,具体取决于Field的值:
<ItemsControl ItemsSource="{Binding Records}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Control>
<Control.Resources>
<ControlTemplate x:Key="StyleA">
<TextBlock Text="Style A" />
</ControlTemplate>
<ControlTemplate x:Key="StyleB">
<TextBlock Text="Style B" />
</ControlTemplate>
</Control.Resources>
<Control.Style>
<Style TargetType="{x:Type Control}">
<Setter Property="Template" Value="{StaticResource StyleA}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Field}" Value="True">
<Setter Property="Template" Value="{StaticResource StyleB}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Control.Style>
</Control>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>