使用基于属性的数据模板

时间:2016-01-18 22:40:41

标签: c# wpf

是否可以根据属性控制节点使用的DataTemplate,而不是通常在wpf中看到的类类型。

在我的情况下,我有一个团队列表,我想控制列表框中列出的每个团队的背景以及一些其他设计元素,例如根据哪个团队显示不同的徽标。在我看来,根据团队名称制作数据模板似乎最简单。

你们怎么建议我处理它。我不想为每个团队创建一个类对象。但是,如果团队没有使用默认设计模板,那将是理想的选择。

无论哪种方式,如果有人可以组合一个超级简单的例子我很欣赏它,因为我不知道该怎么做。

1 个答案:

答案 0 :(得分:1)

根据您的描述,在我看来,这些属性可以保存在Team类上,您可以根据它们显示内容!,但由于您可能需要一些非常复杂的内容,您可以使用{ {1}}基本上你需要做的是:

首先:在资源区域中定义您需要的DataTemplates加上默认值,以防所有团队名称都没有匹配模板,

让我们这样说:

DataTemplateSelector

第二次添加 <Window.Resources> <DataTemplate x:Key="DefaultnDataTemplate" DataType="{x:Type YourNameSpace:Team}"> <Grid Background="LightGreen"> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="*"/> <ColumnDefinition Width="Auto"/> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <TextBlock Text="DefaultnDataTemplate"/> <TextBlock Text="{Binding Id}" Grid.Row="1" Grid.Column="0"/> <TextBlock Text="{Binding Name}" HorizontalAlignment="Center" Grid.Row="1" Grid.Column="1"/> <TextBlock Text="{Binding Matches}" Grid.Row="1" Grid.Column="2"/> </Grid> </DataTemplate> <DataTemplate x:Key="TeamADataTemplate" DataType="{x:Type YourNameSpace:Team}"> <Grid Background="LightCoral"> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="*"/> <ColumnDefinition Width="Auto"/> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <TextBlock Text="TeamADataTemplate"/> <TextBlock Text="{Binding Id}" Grid.Row="1" Grid.Column="0"/> <TextBlock Text="{Binding Name}" HorizontalAlignment="Center" Grid.Row="1" Grid.Column="1"/> <TextBlock Text="{Binding Matches}" Grid.Row="1" Grid.Column="2"/> </Grid> </DataTemplate> <DataTemplate x:Key="TeamBDataTemplate" DataType="{x:Type YourNameSpace:Team}"> <Grid Background="LightBlue"> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="*"/> <ColumnDefinition Width="Auto"/> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <TextBlock Text="TeamBDataTemplate"/> <TextBlock Text="{Binding Id}" Grid.Row="1" Grid.Column="0"/> <TextBlock Text="{Binding Name}" HorizontalAlignment="Center" Grid.Row="1" Grid.Column="1"/> <TextBlock Text="{Binding Matches}" Grid.Row="1" Grid.Column="2"/> </Grid> </DataTemplate> </Window.Resources> 课程,该课程将基本检查团队名称并返回相应的DataTemplateSelector

DataTemplate

第三次,将该类的实例添加到 public class TeamDataTemplateSelector : DataTemplateSelector { public DataTemplate DefaultnDataTemplate { get; set; } public DataTemplate TeamADataTemplate { get; set; } public DataTemplate TeamBDataTemplate { get; set; } public override DataTemplate SelectTemplate(object item, DependencyObject container) { var teamName = (item as Team).Name; switch (teamName) { case "TeamA": return TeamADataTemplate; case "TeamB": return TeamBDataTemplate; default: return DefaultnDataTemplate; } } } ,并将其指向已定义的DataTemplates:

StaticResources

最后调用List中的TemplateSelector:

 <YourNameSpace:TeamDataTemplateSelector x:Key="TeamDataTemplateSelector" TeamADataTemplate="{StaticResource TeamADataTemplate}" TeamBDataTemplate="{StaticResource TeamBDataTemplate}" DefaultnDataTemplate="{StaticResource DefaultnDataTemplate}"/>

这里是我在这个样本中使用的模型:

<ListBox ItemsSource="{Binding Teams}" ItemTemplateSelector="{StaticResource TeamDataTemplateSelector}">       
</ListBox>
相关问题