數據模板DataTemplate與數據模板選擇器DataTemplateSelector
- 一、DataTemplate
- 1. DataTemplate概述
- 2. DataTemplate詳解
- 二、DataTemplateSelector
- 1. DataTemplateSelector概述
- 2. DataTemplateSelector詳解
- 總結
一、DataTemplate
1. DataTemplate概述
DataTemplate 表示數據模板、定義如何顯示一些復雜的數據,決定了數據展示的外觀。
官方文檔:https://learn.microsoft.com/zh-cn/dotnet/api/system.windows.datatemplate?view=netframework-4.8
DataTemplate 的屬性如下:
屬性 | 說 明 |
---|---|
DataType | 獲取或設置此DataTemplate所針對的數據類型。 |
2. DataTemplate詳解
在MainWindow.xaml.cs中自定義Teacher、Student類,在MainWindow.xaml中定義他們的對象如下:
public class Teacher{public String Name { get; set; }public String Desc { get; set; }}public class Student{public String Name { get; set; }public String Age { get; set; }}
<Grid><ContentControl Margin="220,70,345,303"><local:Teacher Name="張三老師" Desc="擅長高等數學"></local:Teacher></ContentControl><ContentControl Margin="220,151,345,217"><local:Student Name="學生" Age="20"/></ContentControl><ContentControl Margin="220,249,345,123"><local:Student Name="學生" Age="20" /></ContentControl></Grid>
如果不提供 DataTemplate,對于復雜數據,控件顯示數據會默認調用對象的 Tostring()方法轉為字符串來顯示。
數據模板有三種用法:
- 在資源中描述 Teacher類型數據顯示的數據模板資源
<Window.Resources><!--在資源中描述 Teacher類型數據顯示的數據模板資源--><DataTemplate DataType="{x:Type local:Teacher}"><Border BorderBrush="red" BorderThickness="3"><StackPanel><TextBlock Text="{Binding Name}" /><TextBlock Text="{Binding Desc}" /></StackPanel></Border></DataTemplate></Window.Resources>
根據顯示內容的類型自動使用數據模板
2. 可以在控件中定義數據模板,將第二項的對象Student擴展如下:
<ContentControl Margin="220,151,345,217"><ContentControl.ContentTemplate><DataTemplate><Border BorderBrush="Green" Background="Yellow" BorderThickness="3"><StackPanel><Button Content="{Binding Name}" /><Button Content="{Binding Age}" /></StackPanel></Border></DataTemplate></ContentControl.ContentTemplate><local:Student Name="學生" Age="20" /></ContentControl>
- 還可以在資源中的數據模板定義Key:
<Window.Resources><!--在資源中的數據模板定義Key--><DataTemplate x:Key="myDataTemplate"><Border BorderBrush="Gray" BorderThickness="3"><StackPanel ><TextBlock Text="{Binding Name}" /><ProgressBar Height="10" Value="{Binding Age}" /></StackPanel></Border></DataTemplate>
</Window.Resources><Grid><ContentControl ContentTemplate="{StaticResource myDataTemplate}" Margin="220,249,345,123"><local:Student Name="王五" Age="28" /></ContentControl>
</Grid>
代碼匯總:
<Window.Resources><!--在資源中描述 Teacher類型數據顯示的數據模板資源--><DataTemplate DataType="{x:Type local:Teacher}"><Border BorderBrush="red" BorderThickness="3"><StackPanel><TextBlock Text="{Binding Name}" /><TextBlock Text="{Binding Desc}" /></StackPanel></Border></DataTemplate><!--在資源中的數據模板定義Key--><DataTemplate x:Key="myDataTemplate"><Border BorderBrush="Gray" BorderThickness="3"><StackPanel ><TextBlock Text="{Binding Name}" /><ProgressBar Height="10" Value="{Binding Age}" /></StackPanel></Border></DataTemplate>
</Window.Resources>
<Grid><ContentControl Margin="220,70,345,303"><local:Teacher Name="張三" Desc="擅長高等數學"></local:Teacher></ContentControl><!--在控件中定義數據模板--><ContentControl Margin="220,151,345,217"><ContentControl.ContentTemplate><DataTemplate><Border BorderBrush="Green" Background="Yellow" BorderThickness="3"><StackPanel><Button Content="{Binding Name}" /><Button Content="{Binding Age}" /></StackPanel></Border></DataTemplate></ContentControl.ContentTemplate><local:Student Name="李四" Age="20" /></ContentControl><ContentControl ContentTemplate="{StaticResource myDataTemplate}" Margin="220,249,345,123"><local:Student Name="王五" Age="28" /></ContentControl>
</Grid>
二、DataTemplateSelector
1. DataTemplateSelector概述
DataTemplateSelector提供一種方法來根據綁定的數據選擇數據模板。
官方文檔:https://learn.microsoft.com/zh-cn/dotnet/api/system.windows.controls.datatemplateselector?view=netframework-4.8
可重寫方法 |
---|
public virtual DataTemplate SelectTemplate(object item, DependencyObject container) |
當在派生類中重寫時,根據數據返回基于自定義邏輯的 DataTemplate。 |
參數: item?要為其選擇模板的數據對象, container?數據綁定對象。 |
2. DataTemplateSelector詳解
在MainWindow.xaml中定義數據模板:
<Window.Resources><DataTemplate x:Key="smallTemplate"><Grid><Rectangle Stroke="Black" /><TextBlock Margin="5" Text="{Binding}" FontSize="18"/></Grid></DataTemplate><DataTemplate x:Key="largeTemplate"><Grid><Ellipse Stroke="Green" StrokeThickness="4" Width="100" Height="100"/><TextBlock Margin="20" Text="{Binding}" FontSize="50" Foreground="Red"/></Grid></DataTemplate>
</Window.Resources>
新建類MyTemplateSelector.cs,自定義模板選擇器
public class MyTemplateSelector : DataTemplateSelector
{public DataTemplate SmallTemplate { get; set; }public DataTemplate LargeTemplate { get; set; }public override DataTemplate SelectTemplate(object item, DependencyObject container){if (item == null){return null; // Null value can be passed by lDE designer}double num = (double)item;return num <= 10 ? SmallTemplate : LargeTemplate;}
}
在MainWindow.xaml中為Label設置模板選擇器屬性
<StackPanel><Label Content="{Binding Value, ElementName=slider}"><Label.ContentTemplateSelector><local:MyTemplateSelector SmallTemplate="{StaticResource smallTemplate}" LargeTemplate="{StaticResource largeTemplate}"/></Label.ContentTemplateSelector></Label><Slider x:Name="slider" Minimum="0" Maximum="100" IsSnapToTickEnabled="True"/></StackPanel>
運行結果如下:
總結
- DataTemplate的三種用法:①在資源中直接描述 類的數據顯示的數據模板,②在資源中的數據模板定義Key,③在控件ContentControl 中定義數據模板。
- 虛函數DataTemplateSelector在使用時需重寫