在WPF中,數據模板是非常強大的工具,他是一塊定義如何顯示綁定的對象的XAML標記。有兩種類型的控件支持數據模板:(1)內容控件通過ContentTemplate屬性支持數據模板;(2)列表控件通過ItemTemplate屬性支持數據模板。為了能夠進一步提升數據模板的功能,在使用中常常會要求動態選擇數據模板。對於列表控件,可以通過設置DataType來解決,復雜時需要使用模板選擇器。以下主要談論以下內容控件中的模板選擇。
在WPF中,有時內容控件(如ContentControl,Button等)會根據數據對象的類型而需要動態變換,可以使用數據模板配合模板選擇器來解決。模板選擇器需要從System.Windows.Controls.DataTemplateSelector繼承,重寫其SelectTemplate方法,在該方法中根據item的類型或item屬性來選擇合適的數據模板。為了能夠選擇模板,需要將模板定義為屬性,如public DataTemplate BoxGirderTemplate { get; set; }等等。
public class MyContentTemplateSelector:DataTemplateSelector
{
public DataTemplate BoxTemplate { get; set; }
public DataTemplate SlabTemplate { get; set; }
public DataTemplate TGirderTemplate { get; set; }
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
ISec s = (ISec)item;
if (s!=null&&s.Name == "Box")
return BoxGirderTemplate;
else if (s != null && s.Name == "Slab")
return SlabTemplate;
else if (s != null && s.Name == "TGirder")
return TGirderTemplate;
return null;
}
}
在xaml中,在內容控件中實例化模板選擇器。在實例化模板選擇器的過程中,將數據模板作為模板選擇器的參數注入,代碼如下:
<ContentControl Name="MyContentControl">
<ContentControl.ContentTemplateSelector>
<local:ElementPropContentTemplateSelector BoxTemplate="{StaticResource BoxGirder}" SlabTemplate="{StaticResource Slab}" TGirderTemplate="{StaticResource TGirder}"/>
</ContentControl.ContentTemplateSelector>
</ContentControl>
此外,在Windows.Resources中,需要定義數據模板,代碼如下:
<Window.Resources>
<DataTemplate x:Key="BoxGirder">
<StackPanel >
..........................
</StackPanel>
</DataTemplate>
<DataTemplate x:Key="Slab">
<StackPanel >
..........................
</StackPanel>
</DataTemplate>
<DataTemplate x:Key="TGirder">
<StackPanel >
..........................
</StackPanel>
</DataTemplate>
<Window.Resources>