Как отобразить все DataGrid ComboBoxCells как ComboBox, когда выбран ряд? - PullRequest
0 голосов
/ 23 марта 2020

Я создал DataGrid, где пользователь должен сделать выбор в двух выпадающих списках, которые присутствуют в каждой строке (см. Img). Теперь я хочу сделать это "аккуратнее". Позвольте мне объяснить на примере.

img 1)

Пользователь должен выбрать значение в категории и размере столбца. Эти столбцы являются комбинированными. При первом щелчке строки выбирается (см. Изображение).

Row selected

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

Примечание: комбинированный список категорий будет получать список значений * stati c, а комбинированный список размеров получит указанный список c значения в зависимости от выбора категории комбинированного списка

Cell clicked

То, чего я хочу добиться, - это меньшее количество кликов для пользователя. Как я могу отобразить строки в выпадающем списке как фактические выпадающие списки и обойти дополнительный щелчок, необходимый для выбора столбца?

Xaml таблицы данных:

<DataGrid x:Name="dataGrid" Margin="10,110,162,15" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" AutoGenerateColumns="False" CanUserAddRows="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="X Coord" Binding="{Binding xCoord}" IsReadOnly="True" Width="*" />
        <DataGridTextColumn Header="Y Coord" Binding="{Binding yCoord}" IsReadOnly="True" Width="*"/>
        <DataGridTextColumn Header="Rotation" Binding="{Binding Rotation}" IsReadOnly="True" Width="*"/>
        <DataGridTextColumn Header="RefDes" Binding="{Binding RefDes}" IsReadOnly="True" Width="*"/>
        <DataGridTextColumn Header="P/N" Binding="{Binding Number}" IsReadOnly="True" Width="*"/>
        <DataGridTextColumn Header="Package" Binding="{Binding Package}" IsReadOnly="True" Width="*"/>
        <DataGridComboBoxColumn Header="Category" Width="*"/>
        <DataGridComboBoxColumn Header="Size" Width="*"/>
    </DataGrid.Columns>
</DataGrid>

Класс привязки:

public class Part
{
    public string Number { get; set; }
    public string RefDes { get; set; }
    public string xCoord { get; set; }
    public string yCoord { get; set; }
    public string Package { get; set; }
    public string Rotation { get; set; }
}

dataGrid.ItemsSource = cadFile.MatchList;

1 Ответ

1 голос
/ 23 марта 2020

Одним из решений является создание собственного шаблона столбца DataGrid, который отображает:

  • a ComboBox при выборе родителя DataGridRow,
  • a TextBlock когда родитель DataGridRow не выбран.

Этого можно добиться, используя DataGridTemplateColumn:

<DataGridTemplateColumn Header="Category" >
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <Grid>
                <ComboBox SelectedValue="{Binding Category, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                          ItemsSource="{Binding CategoryChoices}">
                    <ComboBox.Style>
                        <Style TargetType="ComboBox">
                            <Setter Property="Visibility" Value="Hidden"/>
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGridRow}, Path=IsSelected}"
                                             Value="True">
                                    <Setter Property="Visibility" Value="Visible" />
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </ComboBox.Style>
                </ComboBox>
                <TextBlock Text="{Binding Category}">
                    <TextBlock.Style>
                        <Style TargetType="TextBlock">
                            <Setter Property="Visibility" Value="Visible"/>
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGridRow}, Path=IsSelected}"
                                             Value="True">
                                    <Setter Property="Visibility" Value="Hidden" />
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </TextBlock.Style>
                </TextBlock>
            </Grid>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

Вы также должны добавить SelectionUnit="FullRow" разметка к вашему DataGrid. Если вы не хотите sh сделать это, то вам нужно изменить AncestorType=DataGridRow на AncestorType=DataGridCell, чтобы обнаружить выделение ячейки вместо строки.

Обратите внимание, что я добавил свойство CategoryChoices в каждый элемент для иллюстрации:

public IList<string> CategoryChoices { get; } = new List<string> { "Category1", "Category2" };

Результат:

screen-snapshot

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