wpf datagrid databind с вложенными объектами (как основная деталь) - PullRequest
6 голосов
/ 13 июля 2011

У меня есть простая проблема, связывающая сущность с сеткой данных в wpf.

У меня есть сущность, называемая "Пользователь" .... и у каждого "Пользователя" есть одна "Рабочая группа" ... связь междудва - один к одному.

теперь в EF каждый объект User имеет один объект рабочей группы внутри.

, когда я хочу связать коллекцию пользователей с сеткой данных, я понятия не имею, чтобы сказать, что вы должныПоместите пример рабочей группы. Заголовок внутри таблицы данных.

Я пытаюсь выполнить привязку следующим образом:

XAML:

<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Users}" HorizontalAlignment="Stretch" Margin="5" Name="dgUserList" VerticalAlignment="Stretch" SelectionChanged="dgUserList_SelectionChanged">
                <DataGrid.Columns>
                    <DataGridTextColumn Binding="{Binding FirstName}" Header="FirstName" />
                    <DataGridTextColumn Binding="{Binding LastName}" Header="LastName" />
                    <DataGridTextColumn Binding="{Binding Username}" Header="UserName" />
                    <DataGridTextColumn Binding="{Binding WorkGroup}" Header="Workgroup" />
                </DataGrid.Columns>
            </DataGrid>

Код позади: Создансвойство, подобное этому:

public List<User> Users
    {
        get { return dal.GetUsers(); }
    }

и выполнить привязку:

private void BindGrid()
    {
        dgUserList.ItemsSource = Users;
    }

этот рабочий файл с прямыми свойствами User Entity, но он имеет типРабочая группа внутри столбца данных и ее причина очевидна.Я хочу поместить название рабочей группы в

как мне этого добиться?

любая помощь будет принята с благодарностью

1 Ответ

8 голосов
/ 13 июля 2011

Привязки WPF поддерживают вложенные свойства, поэтому для доступа к любому из под-свойств свойства связанного объекта просто используйте обычное "."синтаксис:

<DataGridTextColumn Binding="{Binding WorkGroup.Title}" Header="Workgroup" />

Вам также не нужно устанавливать ItemsSource дважды.Если у вас есть DataContext из DataGrid, настроенный как Window (или UserControl и т. Д.), Чей кодовый компонент объявил свойство Users, тогда привязки ItemsSource в XAML достаточно и вы можете удалить метод BindGrid.Если вы не установили DataContext, привязка XAML ItemsSource ничего не делает (вы, вероятно, увидите сообщение об ошибке в выходных данных отладки), поэтому вы можете удалить это и просто позволить методу code-behind позаботиться об этом.

Вам также следует рассмотреть возможность использования ObservableCollection для получения автоматических уведомлений и обновлений пользовательского интерфейса при добавлении или удалении элементов.Поскольку вы уже используете EF, вы также можете просто использовать EntityCollection for User, которая включает в себя то же автоматическое уведомление INotifyCollectionChanged.

...