Как получить значение ComboBox из DataGrid - PullRequest
0 голосов
/ 03 апреля 2020

Когда я редактирую ячейку в своей сетке данных, открывается комбинированный список, и я выбираю значение из указанного комбинированного списка, и когда редактирование заканчивается, запускается событие CellEditEnding, и я хочу получить выбранное значение, но не могу найти мое поле со списком в моем событии.

Как я могу получить значение?

<DataGrid x:Name="ModulesTable" 
              Background="#d8deff" 
              Foreground="#383e42" 
              Grid.Row="1" 
              SelectionChanged="ModulesTable_SelectionChanged" 
              CellEditEnding="ModulesTable_CellEditEnding" 
              CanUserAddRows="False"
              CanUserDeleteRows="False"
              CanUserReorderColumns="False"
              AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTemplateColumn Header="ModuleType" >
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Path=ModuleTypeName}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
                <DataGridTemplateColumn.CellEditingTemplate>
                    <DataTemplate>
                        <ComboBox Text="{Binding Path=ModuleTypeName}" SelectionChanged="ComboBox_SelectionChanged" IsEditable="True">
                            <ComboBoxItem>IZMO</ComboBoxItem>
                            <ComboBoxItem>LIMOAP</ComboBoxItem>
                            <ComboBoxItem>LIMOKO</ComboBoxItem>
                            <ComboBoxItem>VIMO</ComboBoxItem>
                        </ComboBox>
                    </DataTemplate>
                </DataGridTemplateColumn.CellEditingTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>

Это то, что я имею до сих пор:

    private void ModulesTable_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
    {
        FrameworkElement element1 = ModulesTable.Columns[1].GetCellContent(e.Row);
        Log.Debug("TypeOF: " + element1.GetType()); // Type is ContentPresenter
        if (element1.GetType() == typeof(ComboBox)) // This doesnt work because its not ComboBox
        {
            var value = ((ComboBox)element1).Text;
            // Get value somehow??
        }

    }

1 Ответ

1 голос
/ 03 апреля 2020

Есть ли причина, по которой вы не используете DataGridComboBoxColumn?

Хорошо, используя MVVM, я бы вызвал ICommand в моей модели представления, где я мог бы просто получить доступ к ограниченному значению ComboBox , Вы можете связать команды, используя EventTrigger.

Сначала добавьте пространство имен:

 xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

Установка Interaction.Triggers:

<DataGrid>
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="CellEditEnding">
                <i:InvokeCommandAction Command="{Binding CellEditEndCommand, Mode=OneWay}"/>
            </i:EventTrigger>
            <i:EventTrigger EventName="RowEditEnding">
                <i:InvokeCommandAction Command="{Binding CellEditEndCommand, Mode=OneWay}"/>
            </i:EventTrigger>
        </i:Interaction.Triggers>

Несколько советов для привязки, я не уверен, если это необходимо для ComboBox, но для TextBox, чтобы получить обновленное значение, вы должны установить UpdateSourceTrigger в PropertyChanged следующим образом: Text="{Binding text, UpdateSourceTrigger=PropertyChanged}"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...