通常我們在ListView中展示一列同類數據,例如城市名稱。不過可以對ListView的DataTemplate稍作修改,讓其顯示層疊信息。例如:需要在ListView中顯示省份和省份對應的城市名稱。首先准備基礎類,
City類:
public class City : ViewModeBase { private string _name; public string Name { get { return _name; } set { if (_name != value) { _name = value; OnPropertyChanged("Name"); } } } }
Province類:
public class Province : ViewModeBase { private string _name; public string Name { get { return _name; } set { if (_name != value) { _name = value; OnPropertyChanged("Name"); } } } private ObservableCollection<City> _citys; public ObservableCollection<City> Citys { get { return _citys; } set { if (_citys != value) { _citys = value; OnPropertyChanged("Citys"); } } } public Province() { _citys = new ObservableCollection<City>(); } }
制作模擬數據:
ObservableCollection<Province> _provinces = null; public MainWindow() { InitializeComponent(); Province provinceJs = new Province() { Name = "江蘇" }; provinceJs.Citys.Add(new City() { Name = "南京"}); provinceJs.Citys.Add(new City() { Name = "蘇州" }); provinceJs.Citys.Add(new City() { Name = "無錫" }); provinceJs.Citys.Add(new City() { Name = "常州" }); provinceJs.Citys.Add(new City() { Name = "鎮江" }); provinceJs.Citys.Add(new City() { Name = "泰州" }); provinceJs.Citys.Add(new City() { Name = "南通" }); Province provinceZj = new Province() { Name = "浙江" }; provinceZj.Citys.Add(new City() { Name = "杭州" }); provinceZj.Citys.Add(new City() { Name = "寧波" }); provinceZj.Citys.Add(new City() { Name = "溫州" }); provinceZj.Citys.Add(new City() { Name = "嘉興" }); provinceZj.Citys.Add(new City() { Name = "湖州" }); provinceZj.Citys.Add(new City() { Name = "紹興" }); provinceZj.Citys.Add(new City() { Name = "金華" }); provinceZj.Citys.Add(new City() { Name = "衢州" }); Province provinceSd = new Province() { Name = "山東" }; provinceSd.Citys.Add(new City() { Name = "濟南" }); provinceSd.Citys.Add(new City() { Name = "濰坊" }); provinceSd.Citys.Add(new City() { Name = "泰安" }); _provinces = new ObservableCollection<Province>(); _provinces.Add(provinceJs); _provinces.Add(provinceZj); _provinces.Add(provinceSd); DataContext = _provinces; }
XAML:
<Window.Resources> <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/> </Window.Resources> <Grid> <ListView ItemsSource="{Binding .}" Width="100" Height="300"> <ListView.Template> <ControlTemplate> <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"> <ItemsPresenter/> </ScrollViewer> </ControlTemplate> </ListView.Template> <ListView.ItemsPanel> <ItemsPanelTemplate> <StackPanel IsItemsHost="True" VirtualizingStackPanel.IsVirtualizing="True" VirtualizingStackPanel.VirtualizationMode="Recycling" /> </ItemsPanelTemplate> </ListView.ItemsPanel> <ListView.ItemTemplate> <DataTemplate DataType="{x:Type local:Province}"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <!--Province--> <Border Grid.Row="0" Background="#e1e2e7"> <StackPanel Orientation="Horizontal" Margin="20,8"> <TextBlock Text="{Binding Name}" Foreground="#647081" FontSize="14"/> <!--<ToggleButton Content="{Binding Name}" IsChecked="False" x:Name="_toggleButton" FontSize="14" Foreground="#647081"/>--> </StackPanel> </Border> <!--City List--> <!--<ListBox Grid.Row="1" ItemsSource="{Binding Citys}" Visibility="{Binding ElementName=_toggleButton, Path=IsChecked,Converter={StaticResource BooleanToVisibilityConverter}}">--> <ListView Grid.Row="1" ItemsSource="{Binding Citys}"> <ListView.Template> <ControlTemplate> <Grid> <ItemsPresenter/> </Grid> </ControlTemplate> </ListView.Template> <ListView.ItemsPanel> <ItemsPanelTemplate> <StackPanel IsItemsHost="True"/> </ItemsPanelTemplate> </ListView.ItemsPanel> <ListView.ItemTemplate> <DataTemplate DataType="{x:Type local:City}"> <TextBlock Text="{Binding Name}" Foreground="#647081" FontSize="12"/> </DataTemplate> </ListView.ItemTemplate> </ListView> </Grid> </DataTemplate> </ListView.ItemTemplate> </ListView> </Grid>
運行效果:
通過在ListView的DataTemplate中再綁定一個ListView來展示層疊信息。
感謝您的閱讀,代碼點擊這里下載。