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: правильная ли вообще архитектура кода для решения задачи такого плана?


Ответы (0 шт):