WPF数据网格绑定

WPF数据网格绑定,wpf,binding,wpfdatagrid,Wpf,Binding,Wpfdatagrid,我使用的是WPF工具包datagrid,在过去,我总是为网格创建要绑定到的实体,例如带有名称、地址等的联系人实体。 在我正在使用的当前应用程序中,用户可以从50个表中进行选择,并从表中单独选择字段以生成视图。 显然,这里有一个要绑定到的实体将不起作用,因为绑定源是动态的 问题是我该怎么做 谢谢您可以保持绑定源代码的原样,但是您可以根据用户对需要隐藏或查看的内容的偏好来过滤DataGrid的列。最好的解决方案是使用匿名类型它工作得很好,请参见以下概念证明: <Window x:Class="

我使用的是WPF工具包datagrid,在过去,我总是为网格创建要绑定到的实体,例如带有名称、地址等的联系人实体。 在我正在使用的当前应用程序中,用户可以从50个表中进行选择,并从表中单独选择字段以生成视图。 显然,这里有一个要绑定到的实体将不起作用,因为绑定源是动态的

问题是我该怎么做


谢谢

您可以保持绑定源代码的原样,但是您可以根据用户对需要隐藏或查看的内容的偏好来过滤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();
        }
    }
}