zoukankan      html  css  js  c++  java
  • 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来展示层叠信息。

    感谢您的阅读,代码点击这里下载。

  • 相关阅读:
    Jenkins file一行代码部署.NET程序到K8S
    重新认识Docker Compose之Sidecar模式
    handycontrol中NumericUpDown无法显示自定义错误提示的解决办法
    InstallShield打包.net项目无法包含数据库、配置文件等
    CROSS APPLY & OUTER APPLY
    C# 取消文件隐藏并恢复标准文件
    C#播放音乐的几种方式
    QT 信号(槽)绑定的使用_connect
    基于TestStand和C#开发平台TTStand 2.5.3.2 Release
    Task 使用详细[基础操作,异步原则,异步函数,异步模式] 更新中...
  • 原文地址:https://www.cnblogs.com/yang-fei/p/4718604.html
Copyright © 2011-2022 走看看