WPF中的數(shù)據(jù)模板(DataTemplate) 周銀輝 在WPF中我們可以為自己的數(shù)據(jù)定制顯示方式,,也就是說(shuō)雖然某數(shù)據(jù)數(shù)據(jù)是一定的,,但我們可以做到讓它的表現(xiàn)方式多種多樣,比如一個(gè)時(shí)間,,在以前我們一般使用一個(gè)字符串(比如“12:03”)來(lái)顯示,,但我們?yōu)槭裁淳筒荒茱@示一個(gè)小時(shí)鐘呢,其實(shí)這更合乎情理,,利用WPF中的數(shù)據(jù)模板技術(shù)隨意并輕松地表現(xiàn)你的數(shù)據(jù). 數(shù)據(jù)模板適用于Content Control類控件與Items Control類控件. 我們假設(shè)有如下一個(gè)類 using System; 這個(gè)類很簡(jiǎn)單地表示了一個(gè)人,,他的姓名和他的照片(路徑)namespace Demo { public class People { private string name; private string photo; public People(string name, string photo) { this.name = name; this.photo = photo; } public string Name { get { return this.name; } set { this.name = value; } } public string Photo { get { return this.photo; } set { this.photo = value; } } } } 如果在我們的軟件中有一個(gè)列表控件ListBox來(lái)顯示一個(gè)由多個(gè)人組成的列表,在.net 3.0以前我們可能就只能用文本來(lái)列出人的姓名而已,或者花不少的精力來(lái)重寫列表控件以便在列表中在顯示人名的同時(shí)顯示照片. 參考以下代碼: <ListBox x:Name="ListBox_PeopleList" ItemTemplate="{StaticResource MyTemplate}" /> 我們定義了一個(gè)ListBox,并將其ItemTemplate制定為我們自定義的MyTemplate,,也就是說(shuō)列表項(xiàng)將按照MyTemplate制定的方式來(lái)顯示列表內(nèi)容,。這樣我們就可以發(fā)揮我們的想像力來(lái)自定義MyTemplate 為了能在XAML中使用我們的People類,我們需要將其名字空間引入,參考以下代碼: xmlns:demo="clr-namespace:Demo" 其中Demo是我們的People類所在的名字空間,以后可以使用demo來(lái)表示這個(gè)名字空間了.下面的代碼來(lái)定義我們的MyTemplate模板,以便告訴我們的列表如何來(lái)顯示他的項(xiàng)目: <Window.Resources> 我們將模板定義為窗口的資源,,資源保存在一個(gè)資源字典中的,,x:Key="MyTemplate" 表示其在資源字典中的鍵,DataType="{x:Type demo:People}"表示該數(shù)據(jù)模板針對(duì)的數(shù)據(jù)類型是demo名字空間下的People類,,接下來(lái)在Gird中我們定義了該數(shù)據(jù)模板的視覺(jué)樹(shù),,這也是我們的工作重心,即該視覺(jué)樹(shù)定義了如何顯示我們的數(shù)據(jù),。我們使用了一個(gè)Image控件并將其Source綁定到People的Photo屬性上,,這樣以便在該Imag控件上顯示照片,然后在Image的右邊我們使用一個(gè)TextBlock控件來(lái)顯示人名(將People的Name屬性綁定到TextBlock的Text屬性上),。<!--列表模板--> <DataTemplate x:Key="MyTemplate" DataType="{x:Type demo:People}"> <Grid VerticalAlignment="Center" HorizontalAlignment="Center" Margin="4,4,4,4" > <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/> </Grid.ColumnDefinitions> <Image Source="{Binding Photo}" Width="50" Height="50" Grid.Column="0" Grid.RowSpan="1"/> <TextBlock Text="{Binding Name}" Grid.Column="1" Grid.ColumnSpan="1" HorizontalAlignment="Center" VerticalAlignment="Center"/> </Grid> </DataTemplate> </Window.Resources> 注意到這個(gè)數(shù)據(jù)模板實(shí)際上在干什么:它定義了People類型對(duì)象的表現(xiàn)方式,,在這里是顯示People的照片并在照片的右方顯示姓名。 以后我們需要People對(duì)象按這種方式展示給用戶的時(shí)候,,我們只要將該數(shù)據(jù)模板指定給要顯示People對(duì)象的那個(gè)控件就可以了,。 比如 <ListBox x:Name="ListBox_PeopleList" ItemTemplate="{StaticResource MyTemplate}" /> 就告訴我們的列表控件按照MyTemplate定義的方式來(lái)顯示其項(xiàng)目。呵呵,,這樣是不是比以前Code方式來(lái)打造一個(gè)個(gè)性列表控件來(lái)得更方便,。 |
|
來(lái)自: 昵稱26028193 > 《WPF》