WPF DataGrid绑定

时间:2011-04-02 07:23:43

标签: wpf binding wpfdatagrid

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

问题是我该怎么办?

由于

4 个答案:

答案 0 :(得分:5)

我只是blogged关于如何基于可重用模型动态创建DataGrid的列。

答案 1 :(得分:2)

最好的解决方案是使用Anonymous Types它完美无缺,请参阅以下概念证明:

<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 :(得分:2)

一种方法是创建一个对象集合,并为每个对象提供一个自定义TypeDescriptor

当网格自动生成列时,它会对您的类使用反射 - 例如,客户,并发现其属性 - 例如,FirstName,Balance等。

但这并不完全正确。 WPF本身不做这项工作 - 它询问TypeDescriptor。并且您可以实现自己的TypeDescriptor,因此您可以假装拥有实际不存在的属性。或者在您的情况下,假装具有确实存在的属性。

答案 3 :(得分:0)

您可以保留绑定源,但是您可以根据用户对他/她需要隐藏或查看的内容的偏好来过滤DataGrid的列。