WPF MVVM ComboBox в DataGrid
Заранее оговорюсь: код максимально упрощен для решения конкретной проблемы.
Имеем некую сущность "критерий", который можно как-то оценить. Оценка выбирается пользователем из определенного набора.
Критерии выводятся списком, поэтому в качестве элемента управления был выбран DataGrid.
Итак, есть класс Criterion
public class Criterion
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
}
Для вывода этого в DataGrid был создан еще один класс CriterionWithResult, который включает в себя критерий, и список возможных оценок:
public class CriterionWithResult
{
public Criterion Criterion { get; set; }
public ObservableCollection<string> Results { get; set; }
public CriterionWithResult(Criterion criterion, ObservableCollection<string> results)
{
Criterion = criterion;
Results = results;
}
}
Во вьюмодели определяю свойства SelectedItem и SelectedIndex (они все однотипны) следующим образом:
private CriterionWithResult _dgSelectedItem;
public CriterionWithResult DGSelectedItem
{
get => _dgSelectedItem;
set
{
_dgSelectedItem = value;
NotifyPropertyChanged(nameof(DGSelectedItem));
}
}
Определены два списка: список класса критериев и список класса критериев со списком возможных оценок:
private ObservableCollection<Criterion> _criterions;
public ObservableCollection<Criterion> Criterions
{
get => _criterions;
set
{
_criterions = value;
NotifyPropertyChanged(nameof(Criterions));
}
}
private ObservableCollection<CriterionWithResult> _criterionWithResults = new ObservableCollection<CriterionWithResult>();
public ObservableCollection<CriterionWithResult> CriterionWithResults
{
get => _criterionWithResults;
set
{
_criterionWithResults = value;
NotifyPropertyChanged(nameof(CriterionWithResults));
}
}
В конструкторе просто заполняю коллекции данными:
public MainVM()
{
Criterions = new ObservableCollection<Criterion>
{
new Criterion
{
Id = 1,
Name = "Test0",
Description = "Its test0"
},
new Criterion
{
Id = 2,
Name = "Test1",
Description = "Its test1"
}
};
foreach(var criterion in Criterions)
CriterionWithResults.Add(new CriterionWithResult(criterion, new ObservableCollection<string> { "1", "2", "3", "4" }));
}
После чего вывожу все это во Veiw:
<DataGrid
AutoGenerateColumns="False"
HeadersVisibility="Column"
IsReadOnly="True"
ItemsSource="{Binding CriterionWithResults}"
SelectedItem="{Binding DGSelectedItem}"
SelectedIndex="{Binding DGSelectedIndex}"
CanUserAddRows="False">
<DataGrid.Columns>
<DataGridTextColumn
Width="Auto"
Header="ID"
Binding="{Binding Path=Criterion.Id}" />
<DataGridTextColumn
Width="*"
Header="Name"
Binding="{Binding Path=Criterion.Name}" />
<DataGridTextColumn
Width="*"
Header="Description"
Binding="{Binding Path=Criterion.Description}" />
<DataGridTemplateColumn
Width="*"
Header="Result">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox
Width="auto"
Height="25"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
ItemsSource="{Binding Path=Results}"
SelectedItem="{Binding CBSelectedItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
SelectedIndex="{Binding CBSelectedIndex, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
Все данные подгружаются корректно, в ComboBox есть все значения, но изначально ничего не выбрано (как я только не пытался это сделать).
Вопрос #1: как задать начальные значения в ComboBox, и как потом достать оттуда выбранные значения? Ведь SelectedItem один на всю View и ViewModel (или я запутался в логике его работы).
Вопрос #2: правильная ли вообще архитектура кода для решения задачи такого плана?