WPF List View 用法

本文详细介绍如何在WPF应用程序中使用ListView控件,并通过XAML实现数据绑定。包括定义结构体、添加数据到ListView、调整数据显示样式等关键步骤。

效果:


XAML:

<ListView Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="3" Grid.RowSpan="4" Margin="10">
                        <ListView.View>
                            <GridView>
                                <GridViewColumn Header="序号" Width="40" />
                                <GridViewColumn Header="动作" Width="100"/>
                                <GridViewColumn Header="轴" Width="100" />
                                <GridViewColumn Header="坐标"  Width="200" />

                            </GridView>
                        </ListView.View>
                    </ListView>

如何添加一行数据:

 假设我们的Listview控件名称是lvActionEditList

先定义一个结构体

struct mhAction
        {
            private string num;
            private string action;
            private string axis;
            private string pos;
            private string value;

            public mhAction(string v1, string v2, string v3, string v4, string v5) : this()
            {
                this.num = v1;
                this.action = v2;
                this.axis = v3;
                this.pos = v4;
                this.value = v5;
            }
        }

添加一条数据到ListView

 lvActionEditList.Items.Add(new mhAction("0","MOV","8,9,10,11","500,450,500,500","0"));

会显示成这样是因为尚未将数据进行绑定


回到XAML编辑界面,根据结构体名称,绑定数据:

<ListView x:Name="lvActionEditList" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="3" Grid.RowSpan="4" Margin="10">
                        <ListView.View>
                            <GridView>
                                <GridViewColumn Header="序号" Width="40" DisplayMemberBinding="{Binding num}"/>
                                <GridViewColumn Header="动作" Width="100" DisplayMemberBinding="{Binding action}"/>
                                <GridViewColumn Header="轴" Width="100" DisplayMemberBinding="{Binding axis}"/>
                                <GridViewColumn Header="坐标"  Width="200" DisplayMemberBinding="{Binding pos}"/>
                                <GridViewColumn Header="参数"  Width="100" DisplayMemberBinding="{Binding value}"/>

                            </GridView>
                        </ListView.View>
                    </ListView>

显示出来是空白的,因为我们必须要手动重写结构体声明的部分,加上{get;set;},还需要把结构体这边的私有改为公有

struct mhAction
        {
            public string num { get; set; }
            public string action { get; set; }
            public string axis { get; set; }
            public string pos { get; set; }
            public string value { get; set; }

            public mhAction(string v1, string v2, string v3, string v4, string v5) : this()
            {
                this.num = v1;
                this.action = v2;
                this.axis = v3;
                this.pos = v4;
                this.value = v5;
            }
        }


如果要居中显示数据,在XAML文件添加自定义风格的描述

 <Window.Resources>
        <Style x:Key="ListViewItemStyle" TargetType="{x:Type ListViewItem}">
            <Setter Property="HorizontalContentAlignment" Value="Center"></Setter>
        </Style>
    </Window.Resources>

应用在ListView上面,修改ListView描述

 <ListView x:Name="lvActionEditList" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="3" Grid.RowSpan="4" Margin="10" ItemContainerStyle="{StaticResource ResourceKey=ListViewItemStyle}">

<think>我们已知:用户希望了解如何在WPF用户控件中添加一个类型为List<T>的依赖属性。依赖属性(DependencyProperty)是WPF中用于支持数据绑定、样式、动画等的属性。定义依赖属性的步骤通常包括:1.在用户控件类中定义依赖属性静态成员。2.使用DependencyProperty.Register方法注册依赖属性。3.创建对应的CLR属性包装器以便在代码中使用。对于List<T>类型的依赖属性,需要注意:-依赖属性默认值设置:通常将默认值设置为一个新的空表,避免多个实例共享同一个表引用。-属性的元数据:可以指定默认值以及属性值改变时的回调方法(如果需要)。根据引用的内容,我们可以参考:引用[2]中提到了在UserControl中使用模板绑定(TemplateBinding)来绑定依赖属性。引用[3]中展示了在用户控件内部使用RelativeSource绑定到用户控件的依赖属性,以避免内部设置DataContext导致外部绑定失效的问题。引用[5]中展示了在用户控件中定义依赖属性,并在外部使用(如Text和Color属性)的例子。步骤:1.在用户控件的代码后台(如.cs文件)中定义依赖属性。2.使用Register方法注册依赖属性,指定属性名称、类型(List<T>)、拥有者类型(用户控件类)以及元数据(可设置默认值)。3.创建CLR属性包装器,使用GetValue和SetValue。4.在用户控件的XAML中,如果需要显示这个表的内容,可以使用ItemsControl或ListBox等集合控件,并将ItemsSource绑定到用户控件的这个依赖属性。注意绑定路径要正确,可以使用RelativeSource绑定到UserControl自身。为了避免内部绑定影响外部DataContext,如引用[3]提到的,我们应避免在用户控件内部设置DataContext,而是使用RelativeSource来绑定到用户控件本身的依赖属性。具体实现如下:</think> ### 如何在 WPF 用户控件中添加 List<T> 类型的依赖属性 在 WPF 中定义`List<T>`类型的依赖属性需遵循以下步骤(以`UserControl`为例): #### 1. **定义依赖属性(代码后端)** ```csharp public partial class MyUserControl : UserControl { // 注册依赖属性 public static readonly DependencyProperty ItemListProperty = DependencyProperty.Register( name: "ItemList", // 属性名 propertyType: typeof(List<string>), // 属性类型(List<T>) ownerType: typeof(MyUserControl), // 所属控件类型 defaultMetadata: new PropertyMetadata( // 元数据设置 defaultValue: new List<string>(), // 默认值(新建空表) propertyChangedCallback: OnListChanged // 值变更回调 ) ); // CLR属性包装器 public List<string> ItemList { get => (List<string>)GetValue(ItemListProperty); set => SetValue(ItemListProperty, value); } // 值变更回调方法 private static void OnListChanged( DependencyObject d, DependencyPropertyChangedEventArgs e) { var control = (MyUserControl)d; var newList = (List<string>)e.NewValue; // 此处处理表变化逻辑(如刷新UI) } } ``` > ⚠️ 关键点: > - 使用`new List<string>()`确保每个控件实例有独立表引用[^3][^5] > - 回调方法中需处理集合变更逻辑 #### 2. **XAML 中的绑定(用户控件内部)** ```xml <UserControl x:Class="MyApp.MyUserControl"> <StackPanel> <!-- 使用ListBox显示表数据 --> <ListBox ItemsSource="{Binding ItemList, RelativeSource={RelativeSource AncestorType=UserControl}}"/> <!-- 集合元素绑定示例 --> <TextBlock Text="{Binding ItemList[0], RelativeSource={RelativeSource AncestorType=UserControl}}"/> </StackPanel> </UserControl> ``` > ⚠️ 绑定技巧: > - 必须使用`RelativeSource`绑定到控件自身[^2][^3] > - 避免内部设置`DataContext = this`导致外部绑定失效 #### 3. **外部使用方式(主窗口)** ```xml <Window> <local:MyUserControl ItemList="{Binding ExternalItems}"/> </Window> ``` ```csharp // 主窗口ViewModel public ObservableCollection<string> ExternalItems { get; } = new() { "A", "B", "C" }; ``` #### 注意事项: 1. **集合变更通知**: - 直接替换整个表会触发变更:`ItemList = new List<string>()` - 修改表元素需手动触发通知(建议改用`ObservableCollection<T>`) 2. **依赖属性优势**: - 支持数据绑定、样式、动画等WPF功能[^1][^4] - 无需手动实现`INotifyPropertyChanged` 3. **设计器支持**: 在属性面板中可直接编辑集合元素(添加`[DesignerSerializationVisibility]`特性) > 完整示例可参考微软文档:[自定义控件中的集合类型依赖属性](https://docs.microsoft.com/zh-cn/dotnet/desktop/wpf/properties/how-to-implement-a-dependency-property?view=netframeworkdesktop-4.8) [^1] --- ### 相关问题 1. **如何在依赖属性变更时自动更新UI?** 2. `ObservableCollection<T>`与`List<T>`作为依赖属性有何区别? 3. 如何在用户控件中实现双向绑定支持? 4. 依赖属性和CLR属性在性能上有何差异? 5. 如何为自定义集合类型(如`List<CustomClass>`)创建依赖属性?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值