Получить значение из Combobox, который внутри DataGrid WPF MVVM

339
12 ноября 2021, 13:40

Есть DataGrid, в ней несколько колонок, одна из них с Combobox. Список для Combobox подгружаю из внешнего файла. Все отображается, но никак не получается получить значение выбранного значения у Combobox. Как правильно это можно сделать. Стараюсь использовать MVVM. Вот мой DataGrid

        <DataGrid Name="MainDataGrid" Grid.Column="3" Grid.Row="3" ItemsSource="{Binding ParametersCollection}"
              SelectedItem="{Binding SelectFile2, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
              AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn  Binding="{Binding Name}" Header="Имя" IsReadOnly="True"/>
            <DataGridTextColumn  Binding="{Binding GroupString}" Header="Группа" IsReadOnly="True"/>
            <DataGridTextColumn  Binding="{Binding Type}" Header="Тип" IsReadOnly="True"/>
            <DataGridCheckBoxColumn Binding="{Binding DeleteCheckBox}" Header="Удаление" />
            <DataGridCheckBoxColumn Binding="{Binding MigrateValueCheckBox}" Header="Перенос значения"/>
            <DataGridTemplateColumn Header="Замена" Width="*">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ComboBox
                            HorizontalContentAlignment="Left"
                            ItemsSource="{Binding DataContext.FopParameterCollection, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" DisplayMemberPath="Name"
                            SelectedValue="{Binding }"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTemplateColumn Header="Категории">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition/>
                                <ColumnDefinition Width="15"/>
                            </Grid.ColumnDefinitions>
                            <Button Grid.Column="1" Content="..." 
                                Command="{Binding DataContext.OpenCategoryCommand, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" 
                                CommandParameter="{Binding}"/>
                            <TextBlock Grid.Column="0" Text="{Binding CategoryCount, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/>
                        </Grid>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>

Свойство ParametersCollection

public ObservableCollection<Parameter> ParametersCollection
{
get => _ParametersCollection;
set
{
_ParametersCollection = value;
OnPropertyChanged(nameof(ParametersCollection));
}
}

Класс Parameter

public class Parameter
{
    public string Name { get; set; }
    public Guid Guid { get; set; }
    public string GroupString { get; set; }
    public BuiltInParameterGroup BuiltInParameterGroup { get; set; }
    public ParameterType Type { get; set; }
    public IEnumerable<Category> EnumCategory { get; set; }
    public bool DeleteCheckBox { get; set; }
    public bool MigrateValueCheckBox { get; set; }
    public Parameter GetFopParameter { get; set; }
    public string CountCategory { get; set; }
    public List<Category> FileCategoriesList { get; set; }
}
Answer 1

В итоге у меня получилось следующим образом

                <DataGridComboBoxColumn Header="Заменить на" Width="*" DisplayMemberPath="Name" SelectedValueBinding="{Binding GetFopParameter}">
                <DataGridComboBoxColumn.ElementStyle>
                    <Style TargetType="{x:Type ComboBox}">
                        <Setter Property="ItemsSource" 
                                Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}},
                            Path=DataContext.FopParameterCollection_MV, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                    </Style>
                </DataGridComboBoxColumn.ElementStyle>
                <DataGridComboBoxColumn.EditingElementStyle>
                    <Style TargetType="{x:Type ComboBox}">
                        <Setter Property="ItemsSource"
                                Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, 
                            Path=DataContext.FopParameterCollection_MV, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                    </Style>
                </DataGridComboBoxColumn.EditingElementStyle>
            </DataGridComboBoxColumn>
READ ALSO
Выполнить JS код в C#

Выполнить JS код в C#

Подскажите, пожалуйста, следующий момент

86
Добавить поддержку .fb2 в wordpress

Добавить поддержку .fb2 в wordpress

Собственно говоря как добавить поддержку форматаfb2 я пробовал добавить вот такой код в functions

111
Как отправить форму отзывов на почту?

Как отправить форму отзывов на почту?

Как отправить форму отзывов на почту + ошибку "Неверно введен e-mail!"?

192