ListView

解释

xml 复制代码
<Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition Width="200"/>
        </Grid.ColumnDefinitions>
        <ListView Grid.Column="0" x:Name="listview" SelectionChanged="listview_SelectionChanged">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="姓名" DisplayMemberBinding="{Binding Name}"/>
                    <GridViewColumn Header="年龄" DisplayMemberBinding="{Binding Age}"/>
                    <GridViewColumn Header="地址" DisplayMemberBinding="{Binding Address}"/>
                </GridView>  
            </ListView.View>
        </ListView>
        <StackPanel Grid.Column="1">
            <StackPanel Orientation="Horizontal" Margin="5">
                <TextBlock Text="姓名:"/>
                <TextBlock x:Name="_TextBlockName"/>
            </StackPanel>
            <StackPanel Orientation="Horizontal" Margin="5">
                <TextBlock Text="年龄:"/>
                <TextBlock x:Name="_TextBlockAge"/>
            </StackPanel>
            <StackPanel Orientation="Horizontal" Margin="5">
                <TextBlock Text="地址:"/>
                <TextBlock x:Name="_TextBlockAddress"/>
            </StackPanel>
        </StackPanel>
    </Grid> 

这段代码是用于构建一个基于WPF (Windows Presentation Foundation) 的用户界面布局。WPF是一个用于构建Windows桌面应用程序的UI框架,允许开发者使用XAML(一种标记语言)与C#等后端语言来创建富客户端应用程序。下面是这段代码的详细解释:

Grid布局

  • 整个界面使用了一个Grid布局控件,这是一种非常灵活的布局方式,允许以行和列的形式组织子控件。
  • Grid.ColumnDefinitions定义了两列。第一列的宽度会自动调整以填满可用空间,因为没有为其指定宽度。第二列的宽度被硬编码为200个像素。

ListView控件

  • ListView控件被放置在Grid的第一列(Grid.Column="0")。这个控件通常用于显示一个项目列表。
  • ListView.View内嵌了一个GridView,这允许ListView以表格形式展示数据。GridView包含了三个GridViewColumn,分别用于展示姓名、年龄和地址,这些数据通过绑定到后端的数据源来动态展示。

StackPanel控件

  • 第二列包含了一个StackPanel,这是另一种布局控件,用于垂直堆叠子控件。
  • 这个StackPanel包含了三个子StackPanel,每个都有一个水平方向的布局(Orientation="Horizontal")。这些子StackPanel分别用于显示姓名、年龄和地址的标签和值。
  • 每个子StackPanel都包含两个TextBlock控件,第一个显示静态文本(例如"姓名:"),第二个用于显示绑定的动态内容,但这里的代码并没有展示如何绑定数据。

动态内容展示

  • ListView中的选项被选中时,触发SelectionChanged事件。这个事件应该通过后端逻辑(C#代码)来处理,以更新右侧StackPanel中的动态内容TextBlock(如_TextBlockName_TextBlockAge_TextBlockAddress)显示当前选中项目的详细信息。

这段代码的主要目的是创建一个用户可以从列表中选择项目,并在旁边查看选中项目详细信息的界面。这种布局和功能在许多应用程序中很常见,如联系人列表、商品目录等。

这里表示给List.View实例化了一个GridView吗?

xml 复制代码
<ListView.View>
                <GridView>
                    <GridViewColumn Header="姓名" DisplayMemberBinding="{Binding Name}"/>
                    <GridViewColumn Header="年龄" DisplayMemberBinding="{Binding Age}"/>
                    <GridViewColumn Header="地址" DisplayMemberBinding="{Binding Address}"/>
                </GridView>  
            </ListView.View>  

是的,这段代码表示给ListView.View属性指定(实例化)了一个GridView。在WPF中,ListView控件用于显示一个项目列表,而通过设置其View属性,可以定义这些项目的展示方式。GridView是一种视图,用于以表格的形式展示ListView中的项,每个列对应列表项的一个属性。

这里,GridView内部定义了三个GridViewColumn元素,每个都有一个Header属性和一个DisplayMemberBinding属性:

  • Header属性定义了列的标题,即表头显示的文本。
  • DisplayMemberBinding属性通过数据绑定指定了该列应显示的数据字段。例如,DisplayMemberBinding="{Binding Name}"表示这一列将显示绑定数据源中每个项的Name属性值。

因此,这段代码的作用是将ListView的视图设置为一个表格视图,其中包含"姓名"、"年龄"和"地址"三列,分别显示绑定数据中的相应信息。这种方式使得ListView能够以更结构化的形式展示复杂数据,增强了信息的可读性和用户的交互体验。

为什么不是Person.Name而是Name?

xml 复制代码
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Threading;

namespace WpfApp3
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        private string file = string.Empty;
        public class Person
        {
            public string Name { get; set; }
            public int Age { get; set; }
            public string Address { get; set; }

        }
        public MainWindow()
        {
            InitializeComponent();

            listview.Items.Add(new Person { Name = "张三", Age = 22, Address = "广东省廉江市车板镇大坝村" });
            listview.Items.Add(new Person { Name = "李四", Age = 23, Address = "江西省景德镇市市辖区" });
            listview.Items.Add(new Person { Name = "王五", Age = 24, Address = "上海市虹口区" });
        }

        private void listview_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            ListView listView = sender as ListView;
            if (listView == null) return;

            var person = listView.SelectedItem as Person;
            if (person == null) return;

            _TextBlockName.Text = person.Name;
            _TextBlockAge.Text = person.Age + "岁";
            _TextBlockAddress.Text = person.Address;
        }
    }
}
这是后端代码,数据绑定的时候using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Threading;

namespace WpfApp3
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        private string file = string.Empty;
        public class Person
        {
            public string Name { get; set; }
            public int Age { get; set; }
            public string Address { get; set; }

        }
        public MainWindow()
        {
            InitializeComponent();

            listview.Items.Add(new Person { Name = "张三", Age = 22, Address = "广东省廉江市车板镇大坝村" });
            listview.Items.Add(new Person { Name = "李四", Age = 23, Address = "江西省景德镇市市辖区" });
            listview.Items.Add(new Person { Name = "王五", Age = 24, Address = "上海市虹口区" });
        }

        private void listview_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            ListView listView = sender as ListView;
            if (listView == null) return;

            var person = listView.SelectedItem as Person;
            if (person == null) return;

            _TextBlockName.Text = person.Name;
            _TextBlockAge.Text = person.Age + "岁";
            _TextBlockAddress.Text = person.Address;
        }
    }
}

在WPF中,当你在XAML文件中通过Binding语法绑定数据时,所引用的属性名称是相对于绑定上下文(DataContext)的路径。在你的ListView中,每个GridViewColumnDisplayMemberBinding设置为{Binding Name}{Binding Age}{Binding Address},这里的NameAgeAddress是相对于ListView的每个项(这里是Person对象)的属性名称。这意味着WPF数据绑定机制会自动寻找每个Person对象的NameAgeAddress属性,并将这些属性的值显示在对应的列中。

简单来说,当你写{Binding Name}时,WPF查找的是当前绑定上下文中的Name属性。因为在这个上下文中,ListView的每一项都是一个Person对象,所以WPF自动解析为Person.Name,以此类推对于AgeAddress属性。这是数据绑定的一种简化写法,使得你不必显式指定完整的路径(如Person.Name),而是直接引用属性名称,WPF框架会根据上下文自动寻找到正确的属性。

这种方式极大简化了在XAML中绑定数据的复杂度,使得开发者能够以更简洁的方式将UI控件与数据模型关联起来,提高了开发效率和代码的可读性。

相关推荐
月落.1 小时前
WPF的<ContentControl>控件
wpf
就是有点傻1 小时前
WPF中的依赖属性
开发语言·wpf
wangnaisheng1 小时前
【WPF】把一个Window放在左上角/右上角顶格显示
wpf
WineMonk1 小时前
.NET WPF CommunityToolkit.Mvvm框架
.net·wpf·mvvm
月落.1 小时前
WPF中的INotifyPropertyChanged接口
wpf
界面开发小八哥2 小时前
界面控件DevExpress WPF中文教程:Data Grid——卡片视图设置
.net·wpf·界面控件·devexpress·ui开发
平凡シンプル2 小时前
WPF 打包
wpf
VickyJames2 小时前
基于XAML框架和跨平台项目架构设计的深入技术分析
wpf·开源分享·unoplatform·winui3·项目架构
冷眼Σ(-᷅_-᷄๑)5 小时前
WPF缩放动画和平移动画叠加后会发生什么?
wpf·动画
△曉風殘月〆7 小时前
WPF MVVM入门系列教程(二、依赖属性)
c#·wpf·mvvm