WPF数据表格绑定

3
我正在使用WPF工具包中的Datagrid,在过去总是为网格创建实体进行绑定,例如一个包含名称、地址等的Contact实体。 在我当前工作的应用程序中,用户可以从50个表中选择,并逐个选择表中的字段来生成视图。 很明显在这里,由于绑定源是动态的,所以无法使用绑定到实体。 我的问题是我该怎么做? 谢谢
4个回答

5

我刚刚写了一篇博客,介绍如何基于可重用模型动态创建DataGrid的列。


保罗,你博客里的代码有效! 我面临的一个问题是,在结尾添加了一个名为“属性”的列,并且所有列值都是“(Collection)”而没有引号。 请告诉我为什么会出现该列。谢谢... - Manoj

2
最佳解决方案是使用匿名类型,它可以完美地工作,看下面的概念验证:
<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>

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();
        }
    }
}

2
一种方法是创建一个对象集合,并为每个对象设置自定义的TypeDescriptor
当网格自动生成列时,它会使用反射来检查您的类 - 如Customer,并发现其属性 - 如FirstName、Balance等。
但这并不完全正确。WPF本身并不执行此操作 - 它会请求TypeDescriptor。您可以实现自己的TypeDescriptor,因此您可以假装拥有实际不存在的属性。或者在您的情况下,假装没有存在的属性。

+1 给这个超棒的链接。如果有选项的话,我会给 +2 的 :) - Elad Katz

0

您可以保留绑定源不变,但是您可以根据用户的偏好来过滤DataGrid的列,以便隐藏或显示。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接