WPF中的數據模板使用方式之一:ContentControl、ContentTemplate和TemplateSelector的使用


在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>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM