参考JusterZhu视频和文档,ppt文档基本全抄
一、DataTemplate
在日常开发中,会遇到需要在一个集合控件中通过某个Type属性选择不同的View显示在控件上。那么用常规的绑定是无法完成的,这时候微软提供了一个DataTemplateSelector对象帮助开发者完成此项功能。
实现步骤:
1.实现需要绑定的集合,并指定好类型
2.实现不同的DataTemplate,并实现好里面的样式
3.基于DataTemplateSelector实现自定义模板选择器
4.将DataTemplateSelector 、 DataTemplate、List、目标控件关联(绑定)起来。
<Window x:Class="test_05.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:test_05"
mc:Ignorable="d"
Title="TestTemplateSelector" Height="450" Width="800">
<Window.DataContext>
<local:MainViewModel></local:MainViewModel>
</Window.DataContext>
<Window.Resources>
<DataTemplate x:Key="OneDataTemplate" DataType="{x:Type local:MainModel}">
<Border Background="{Binding Color}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Name}" VerticalAlignment="Center"></TextBlock>
<Button Width="50" Height="30"></Button>
</StackPanel>
</Border>
</DataTemplate>
<DataTemplate x:Key="TwoDataTemplate" DataType="{x:Type local:MainModel}">
<Border Background="{Binding Color}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Name}" Width="100"
VerticalAlignment="Center" HorizontalAlignment="Center"
TextAlignment="Center" />
<Border BorderBrush="Black" BorderThickness="5">
<Rectangle
Width="50"
Height="30"
Fill="{Binding Color}" />
</Border>
</StackPanel>
</Border>
</DataTemplate>
<DataTemplate x:Key="ThreeDataTemplate" DataType="{x:Type local:MainModel}">
<Border Background="{Binding Color}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Name}" />
<Rectangle
Width="50"
Height="30"
Fill="{Binding Color}" />
</StackPanel>
</Border>
</DataTemplate>
<DataTemplate x:Key="FourDataTemplate" DataType="{x:Type local:MainModel}">
<Border Background="{Binding Color}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Name}" />
<Rectangle
Width="50"
Height="30"
Fill="{Binding Color}" />
</StackPanel>
</Border>
</DataTemplate>
<local:DataTypeTemplateSelector x:Key="test"></local:DataTypeTemplateSelector>
</Window.Resources>
<Grid>
<ListBox ItemTemplateSelector="{StaticResource test}" ItemsSource="{Binding mainModels}"></ListBox>
</Grid>
</Window>
internal class DataTypeTemplateSelector: DataTemplateSelector
{
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
if (item is MainModel)
{
var model = item as MainModel;
switch (model.Person)
{
case Person.One:
return (container as FrameworkElement).FindResource("OneDataTemplate") as DataTemplate;
case Person.Two:
return (container as FrameworkElement).FindResource("TwoDataTemplate") as DataTemplate;
case Person.Three:
return (container as FrameworkElement).FindResource("ThreeDataTemplate") as DataTemplate;
case Person.Four:
return (container as FrameworkElement).FindResource("FourDataTemplate") as DataTemplate;
}
}
return base.SelectTemplate(item, container);
}
}
public enum Person
{
One,
Two,
Three,
Four
}
internal class MainModel
{
public string Name { get; set; }
public Person Person { get; set; }
public string Color { get; set; }
}
internal class MainViewModel
{
public ObservableCollection<MainModel> mainModels { get; set; }
public MainViewModel()
{
mainModels = new ObservableCollection<MainModel>
{
new MainModel { Person = Person.One, Name = "dawa", Color = "Red" },
new MainModel { Person = Person.Two, Name = "erwa", Color = "Green" },
new MainModel { Person = Person.Three, Name = "sanwa", Color = "Blue" },
new MainModel { Person = Person.Four, Name = "siwa", Color = "Yellow" }
};
}
}