Моя цель состоит в том, чтобы иметь набор каскадных comboboxes в WPF. Я пытаюсь использовать модель MVVM, но все еще учась.Каскадный ComboBox в DataGrid с MVVM
Некоторая справочная информация о проекте. Я пытаюсь изменить время для сотрудников.
Итак, у меня есть список Times для выбранного сотрудника в DataGrid. Каждая строка в DataGrid является объектом Time. Время состоит из некоторых полей InTime, OutTime, Date, Hours ... ect. Время также имеет отдел и работу.
В настоящее время у меня есть отдел ComboBox, подключенный и работающий, но я не уверен, как создать поле со списком Job на основе того, что выбрано в поле Department.
Вот как мой ViewModel настроен
public ObservableCollection<Time> Times { get; set; }
public ObservableCollection<Department> Departments { get; set; }
public TimeSheetsViewModel()
{
Times = new ObservableCollection<Time>();
Departments = new ObservableCollection<Departments>();
GetDepartments();
}
private void GetDepartments()
{
/*
This section contains code to connect to my SQL Database and fills a DataTable dt
*/
if (Departments != null)
Departments.Clear();
for (int i = 0; i < dt.Rows.Count; i++)
{
Department d = new Department() { Display = dt.Rows[i]["DISPLAY"].ToString(), DepartmentCode = dt.Rows[i]["DEPARTMENT_CODE"].ToString(), CompanyCode = dt.Rows[i]["COMPANY_CODE"].ToString() };
Departments.Add(d);
}
}
Это связывание на моем DataGrid
<DataGrid Grid.Row="1" Margin="15,0,15,15" Visibility="Visible" FontSize="14" HorizontalGridLinesBrush="{StaticResource Nelson2}" VerticalGridLinesBrush="{StaticResource Nelson2}" ItemsSource="{Binding Times}" SelectionMode="Single" CellEditEnding="DataGrid_CellEditEnding" RowEditEnding="DataGrid_RowEditEnding" AutoGenerateColumns="False">
<DataGridTemplateColumn Header="Department Code">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path= Department.Display}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding RelativeSource={RelativeSource Findancestor, AncestorType={x:Type UserControl}}, Path=DataContext.Departments}" DisplayMemberPath="Display" SelectedValuePath="DepartmentCode" SelectedValue="{Binding Department.DepartmentCode}" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
</DataGrid>
Так как же я могу осуществить свою работу выпадающего для заполнения его элементов на основе независимо выбран для отдела в этой строке?
Я предполагаю, что хочу поместить код для этого в мою модель просмотра.
Любая помощь приветствуется, спасибо!
EDIT (04/05/16):
Как вернуть объект с конвертером, так что я могу использовать этот конвертер, чтобы связать различные вещи к полям этого объекта.
Скажи это мой конвертер
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
string departmentCode = values[0].ToString();
ObservableCollection<Department> Departments = values[1] as ObservableCollection<Department>;
return Departments.FirstOrDefault(Department => Department.DepartmentCode == departmentCode);
}
И это мое связывание
<TextBlock >
<TextBlock.Text>
<MultiBinding Converter="{StaticResource DeptCodeToDeptConverter}" >
<Binding Path="DepartmentCode" />
<Binding Path="DataContext.Departments" RelativeSource="{RelativeSource Findancestor, AncestorType={x:Type UserControl}}"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
Этот конвертер будет возвращать объект отдел, но что, если я хочу текст в TextBlock, чтобы быть Department.Name или Department.Location. Должен ли я создать новый конвертер для возврата каждого поля, которое я хочу использовать в разных элементах управления? Или есть способ достичь того, что я хочу использовать с помощью этого метода?
Спасибо @ Joe, я здесь немного смущен. Довольно новый на этом. Так что каждая строка в моем DataGrid должна быть привязана к ее собственному экземпляру модели представления? –
Извините, должен был уточнить, да, каждая строка будет иметь модель обзора. Вот как я это сделаю. Если бы это была простая таблица данных, я не думаю, что это оправдывает это, но у вас явно есть более сложные функции. Вы могли бы использовать, вероятно, использовать конвертеры с несколькими связями без моделей просмотра строк. Сколько строк вы ожидаете? – Joe
Рассматривая, как вы его реализовали, привязка multI должна отлично работать без моделей времени. Завтра я получу более подробный пример (9 часов или около того).Что определяет, какой сбор gos во второй блок со списком (используя код отдела из первого, который я предполагаю)? – Joe