WPF数据网格绑定
我使用的是WPF工具包datagrid,在过去,我总是为网格创建要绑定到的实体,例如带有名称、地址等的联系人实体。 在我正在使用的当前应用程序中,用户可以从50个表中进行选择,并从表中单独选择字段以生成视图。 显然,这里有一个要绑定到的实体将不起作用,因为绑定源是动态的 问题是我该怎么做WPF数据网格绑定,wpf,binding,wpfdatagrid,Wpf,Binding,Wpfdatagrid,我使用的是WPF工具包datagrid,在过去,我总是为网格创建要绑定到的实体,例如带有名称、地址等的联系人实体。 在我正在使用的当前应用程序中,用户可以从50个表中进行选择,并从表中单独选择字段以生成视图。 显然,这里有一个要绑定到的实体将不起作用,因为绑定源是动态的 问题是我该怎么做 谢谢您可以保持绑定源代码的原样,但是您可以根据用户对需要隐藏或查看的内容的偏好来过滤DataGrid的列。最好的解决方案是使用匿名类型它工作得很好,请参见以下概念证明: <Window x:Class="
谢谢您可以保持绑定源代码的原样,但是您可以根据用户对需要隐藏或查看的内容的偏好来过滤DataGrid的列。最好的解决方案是使用
匿名类型
它工作得很好,请参见以下概念证明:
<Window x:Class="MyProject.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:System="clr-namespace:System;assembly=mscorlib"
Title="MainWindow"
Height="136" Width="525"
Loaded="OnWindowLoaded">
<DataGrid ItemsSource="{Binding}">
</DataGrid>
使用System.Collections.ObjectModel;
使用System.Linq;
使用System.Windows;
名称空间MyProject{
公共部分类主窗口:窗口
{
公营雇员
{
公共int Id{get;set;}
公共字符串代码{get;set;}
公共字符串名称{get;set;}
公共int作业{get;set;}
公共字符串地址{get;set;}
}
私人可观察收集(empu collection);;
公共主窗口()
{
初始化组件();
}
WindowLoaded上的私有void(对象发送方,RoutedEventArgs e)
{
//生成测试数据
_EMP收集=
新可观测集合
{
新员工{Id=234,Code=“E041”,Name=“Employee1”,Job=1,Address=“…”},
新员工{Id=245,Code=“E701”,Name=“Employee2”,Job=3,Address=“…”},
新员工{Id=728,Code=“E001”,Name=“Employee3”,Job=9,Address=“…”},
新员工{Id=663,Code=“E051”,Name=“Employee4”,Job=7,Address=“…”},
};
数据上下文=
(来自我的收藏)
选择新的{i.Code,i.Name,i.Address}).ToList();
}
}
}
一种方法是创建一个对象集合,并为每个对象指定一个自定义对象
当网格自动生成列时,它会对类(例如Customer)使用反射,并发现其属性(例如FirstName、Balance等)
但这并不完全正确。WPF本身不做这项工作——它要求一个类型描述符。您可以实现自己的TypeDescriptor,这样您就可以假装拥有实际上不存在的属性。或者在你的情况下,假装没有确实存在的属性 我刚刚介绍了如何基于可重用模型为DataGrid动态创建列。+1获取精彩链接。如果有选择的话,我会给+2:)保罗,你博客中的代码有效!我面临的一个问题是,在最后添加了一列,标题为“Properties”,所有列的值都是“(Collection)”,没有引号。请告诉我为什么会出现那个专栏。谢谢
using System.Collections.ObjectModel;
using System.Linq;
using System.Windows;
namespace MyProject {
public partial class MainWindow : Window
{
public class Employee
{
public int Id { get; set; }
public string Code { get; set; }
public string Name { get; set; }
public int Job { get; set; }
public string Address { get; set; }
}
private ObservableCollection<Employee> _empCollection;
public MainWindow()
{
InitializeComponent();
}
private void OnWindowLoaded(object sender, RoutedEventArgs e)
{
// Generate test data
_empCollection =
new ObservableCollection<Employee>
{
new Employee {Id = 234, Code = "E041", Name = "Employee1", Job = 1, Address = "..."},
new Employee {Id = 245, Code = "E701", Name = "Employee2", Job = 3, Address = "..."},
new Employee {Id = 728, Code = "E001", Name = "Employee3", Job = 9, Address = "..."},
new Employee {Id = 663, Code = "E051", Name = "Employee4", Job = 7, Address = "..."},
};
DataContext =
(from i in _empCollection
select new {i.Code, i.Name, i.Address}).ToList();
}
}
}