WPF DataGrid Родительские дочерние данные - PullRequest
2 голосов
/ 29 июля 2010

Я новичок в WPF / C # / NET, но я научился кодировать некоторые небольшие упражнения.

В любом случае, я застрял.Я нашел здесь и Google, и не могу найти ответ, или, возможно, более правильно, не могу найти ответ, который я могу понять.

Моя проблема заключается в этом ... с помощью Entity Framework у меня есть двастолы.Один для информации о сотруднике и один для компании.Сотрудники работают в 0 или 1 компании.

Я хотел бы через WPF / XAML определить сетку данных для навигации по сотрудникам.Но в каждом ряду сотрудников я хотел бы указать название компании, в которой они работают (если есть отношения) или «Безработный» в случаях, когда нет соответствующей записи о компании.

Я не далдетали таблиц, поскольку это действительно не имеет значения - проблема заключается в отображении объединенной информации из родительских / дочерних отношений в одной сетке данных.

Я не знаю, каков наилучший подход к решению этой проблемы, я предполагаюWPF / DataGrid, поэтому я был бы очень признателен за помощь в том, как это сделать, связывание (при условии WPF) или даже пример WPF / XAML

Заранее спасибо.

1 Ответ

3 голосов
/ 29 июля 2010

Есть много способов сделать это - один из способов, который вы можете попробовать, - создать модель представления, которая инкапсулирует данные, которые вы хотите отобразить - например,

public class EmployeeViewModel
{
    private readonly Employee _employee;

    public EmployeeViewModel(Employee employee)
    {
        _employee = employee;
    }

    public string Name { get { return _employee.Name; } }
    public string CompanyName { get { return _employee.Company == null ? "Unemployed" : _employee.Company.CompanyName; } }
}

Затем, учитывая IEnumerable<Employee>, вы можете проецировать данные вашего сотрудника в эту модель представления и установить их в качестве ItemsSource вашей DataGrid - например,

IEnumerable<Employee> employees = GetEmployeesFromDatabase();    
DataGrid1.ItemsSource = employees.Select(x => new EmployeeViewModel(x));

Обычно вы устанавливаете ItemsSource с помощью привязки xaml здесь, а не устанавливаете его непосредственно в коде, но это предполагает использование родительского ViewModel, установленного в качестве DataContext для представления, и я пытаюсь упростить ситуацию.

Еще один способ сделать это с помощью DataGrid - отказаться от использования модели представления, напрямую привязаться к коллекции IEnumerable<Employee> и явно установить привязки столбцов - например,

<DataGrid ItemsSource="{Binding Employees}" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Employee Name" Binding="{Binding Name}" />
        <DataGridTextColumn Header="Company Name" Binding="{Binding Company.Name}" />
    </DataGrid.Columns>
</DataGrid>

Обратите внимание, что во втором примере «Безработный» не появится в столбце «Название компании», где для сотрудника нет ассоциированной компании.

РЕДАКТИРОВАТЬ: Чтобы прояснить вопрос об установке источника элементов для вашей таблицы из свойства в «основной» модели представления, связанной с представлением, вы можете создать класс ViewModel, который представляет весь текущий вид. например, * 1 016 *

public class MainViewModel
{
    private readonly IEnumerable<Employee> _employees;

    public MainViewModel(IEnumerable<Employee> employees)
    {
        _employees = employees;
    }

    public IEnumerable<Employee> Employees
    {
        get { return _employees; }
    }
}

Вы установили бы это как DataContext для Window / UserControl.

например. в простых случаях вы можете сделать это в конструкторе вашего окна (хотя вызовы базы данных должны быть действительно асинхронными для приложений WPF, где это возможно).

 public MainWindow()
 {
     InitializeComponent();
     DataContext = new MainViewModel(GetAllEmployees());
 }

Затем вы можете настроить привязку в вашей Grid следующим образом:

<DataGrid ItemsSource="{Binding Employees}" ...

Контекст данных для главного окна затем используется для всех дочерних элементов управления, содержащихся в нем, кроме случаев, когда вы явно устанавливаете DataContext для дочернего элемента управления. Этот метод становится полезным, когда у вас есть более сложные ViewModels со многими свойствами и командами. Если вы заинтересованы в получении дополнительной информации, вам следует взглянуть на шаблон MVVM и на одну или обе среды Prism / Caliburn.

...