WPF DataGrid Binding - PullRequest
       1

WPF DataGrid Binding

3 голосов
/ 02 апреля 2011

Я использую сетку данных набора инструментов WPF и в прошлом всегда создавал объекты для привязки к сетке, например, контактный объект с именем, адресом и т. Д. В текущем приложении, над которым я работаю, пользователь может выбрать из 50 таблиц и индивидуально выбрать поля из таблиц, чтобы создать представление. Очевидно, что наличие сущности для привязки не будет работать, поскольку источник привязки будет динамическим.

Вопрос в том, что мне делать?

Спасибо

Ответы [ 4 ]

5 голосов
/ 03 апреля 2011

Я только что написал в блоге о том, как динамически создавать столбцы для DataGrid на основе многоразовой модели.

2 голосов
/ 02 апреля 2011

Лучшее решение - использовать 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 голосов
/ 03 апреля 2011

Один из подходов состоит в создании коллекции объектов и присвоении каждому объекту пользовательского TypeDescriptor .

Когда сетка автоматически генерирует столбцы, она использует отражение над вашим классом, например, Customer, и обнаруживает его свойства, например FirstName, Balance и т. Д.

Но это не совсем так.WPF не выполняет саму работу - он запрашивает TypeDescriptor.И вы можете реализовать свой собственный TypeDescriptor, чтобы вы могли притворяться, что у вас есть свойства, которые на самом деле не существуют .Или, в вашем случае, притворитесь, что не , чтобы иметь свойства, которые существуют.

0 голосов
/ 02 апреля 2011

Вы можете оставить источник привязки таким, какой он есть, однако вы можете фильтровать столбцы DataGrid на основе предпочтений пользователя относительно того, что ему / ей нужно скрыть или просмотреть.

...