Есть много способов сделать это - один из способов, который вы можете попробовать, - создать модель представления, которая инкапсулирует данные, которые вы хотите отобразить - например,
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.