在 WPF 中有几种方法可以实现这一点,一种方法是使用DataTemplates
来描述您希望如何显示对象。使用ItemsControl
或派生控件来保存显示您的收藏:
我经常将我的样式分成各种类型,以使它们更易于阅读,例如:
<Window x:Class="WpfApplication2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication2"
Title="MainWindow" Height="350" Width="525"
DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Window.Resources>
<!-- Book Chapters -->
<DataTemplate DataType="{x:Type local:BookChapter}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=Name}" />
<ItemsControl ItemsSource="{Binding Path=Pages}" />
</StackPanel>
</DataTemplate>
<!-- Book Pages -->
<DataTemplate DataType="{x:Type local:BookPage}">
<StackPanel Orientation="Horizontal" >
<TextBlock Text="{Binding Path=Id}" Margin="5 0"/>
<TextBlock Text="{Binding Path=Name}" Margin="5 0"/>
<ItemsControl ItemsSource="{Binding Path=Exercises}" />
</StackPanel>
</DataTemplate>
</Window.Resources>
<Grid>
<ListBox ItemsSource="{Binding Path=Chapters}" />
</Grid>
这将产生看起来像这样的东西(基于我填充你的对象的内容):
在不模板化您的对象的情况下,WPF
只会将集合显示为ApplicationName.ClassName
- 结果ToString
,模板使您能够定义您希望如何显示您的类。
您可以将这些模板保存在单独的资源文件中,并在需要时在您的应用程序中重复使用它们。重要的是要注意,因为我正在模板化 actual Type
,所以只要您的对象显示在这个 special 中,就会使用这个模板Window
,除非您另有说明。
您可以通过命名它们并仅将它们应用于特定组件 ( http://msdn.microsoft.com/en-us/library/ms742521.aspx ) 来更好地控制何时/何时使用这些模板。