WPF ListView展示層疊信息


通常我們在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來展示層疊信息。

感謝您的閱讀,代碼點擊這里下載。


免責聲明!

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



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