WPF .NET Framework中ListView无法访问属性的技术咨询
解决WPF中ListView无法访问Column属性的问题
嘿,你这明显是把WPF和WinForms的两套控件体系搞混啦!这俩框架的控件完全是独立设计的,用法天差地别,咱们一步步理清楚:
核心问题根源
你当前用的是WPF .NET Framework项目,但你尝试使用的是WinForms的System.Windows.Forms.ListView,而WPF原生的ListView是System.Windows.Controls.ListView——这俩控件不仅命名空间不同,连核心属性和实现逻辑都完全不一样:
- WinForms的ListView确实有
Columns属性(注意是复数),但WPF的ListView根本没有这个属性,它是用GridView来定义列的。 - 你代码里的强制转换
(System.Windows.Forms.ListView)lsView.Column本身就有问题:一是少了s(应该是Columns),二是如果lsView是你在WPF里拖入的控件,它本身就是WPF的ListView,强制转换会失败,自然找不到对应的属性。
正确解决方案(推荐用WPF原生控件)
WPF的ListView是通过GridView来管理列的,不管是XAML还是后台代码,都要遵循这个逻辑:
1. XAML中定义带列的ListView
直接在XAML里配置GridView来创建列:
<!-- 确保lsView是WPF的System.Windows.Controls.ListView --> <ListView x:Name="lsView"> <ListView.View> <GridView> <!-- 定义列,Header是列标题,DisplayMemberBinding绑定数据属性 --> <GridViewColumn Header="姓名" DisplayMemberBinding="{Binding Name}" Width="100"/> <GridViewColumn Header="年龄" DisplayMemberBinding="{Binding Age}" Width="80"/> </GridView> </ListView.View> </ListView>
2. 后台代码动态创建列并绑定数据
如果需要在代码里生成列,要先创建GridView再赋值给ListView的View属性:
// 第一步:创建GridView和列 GridView gridView = new GridView(); gridView.Columns.Add(new GridViewColumn { Header = "姓名", DisplayMemberBinding = new Binding("Name"), Width = 100 }); gridView.Columns.Add(new GridViewColumn { Header = "年龄", DisplayMemberBinding = new Binding("Age"), Width = 80 }); // 第二步:把GridView赋值给ListView lsView.View = gridView; // 第三步:准备数据并绑定(需要先定义一个数据模型) var userList = new List<User> { new User { Name = "张三", Age = 25 }, new User { Name = "李四", Age = 30 } }; lsView.ItemsSource = userList; // 数据模型类(放在项目里) public class User { public string Name { get; set; } public int Age { get; set; } }
特殊需求:非要在WPF里用WinForms的ListView?
如果因为某些原因必须用WinForms的ListView,你不能直接在WPF里拖入或创建,必须用WindowsFormsHost来承载WinForms控件:
XAML配置
<!-- 先引入WinForms的命名空间 --> xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms" <!-- 用WindowsFormsHost承载WinForms的ListView --> <WindowsFormsHost> <wf:ListView x:Name="winFormsListView" View="Details"> <wf:ListView.Columns> <wf:ColumnHeader Text="WinForms列1" Width="120"/> <wf:ColumnHeader Text="WinForms列2" Width="120"/> </wf:ListView.Columns> </wf:ListView> </WindowsFormsHost>
后台代码访问属性
现在就能正常访问WinForms ListView的Columns属性了:
// 添加新列 winFormsListView.Columns.Add(new System.Windows.Forms.ColumnHeader { Text = "新列", Width = 100 }); // 添加行数据 winFormsListView.Items.Add(new System.Windows.Forms.ListViewItem(new[] { "行1数据1", "行1数据2", "行1数据3" }));
⚠️ 注意:这种跨框架混用的方式会带来性能损耗和样式不一致的问题,除非必要不建议使用。
内容的提问来源于stack exchange,提问作者Michiel Krol
相关产品推荐
相关产品推荐

