WPF: как заменить TextBox таблицы данных, используемой для редактирования в DataGridTextColumn - PullRequest
0 голосов
/ 24 марта 2020

Я действительно не нашел подходящего решения для следующей проблемы: когда я редактирую некоторые столбцы DataGrid в WPF / NetCore, я хотел бы использовать настраиваемое текстовое поле или элемент управления, чтобы я мог выполнять различные действия, например предупреждение для дубликатов отображать похожие записи или события, препятствующие заполнению дубликатов, и т. д. c ...

<DataGrid ItemsSource="{Binding lessonEntries}" AutoGenerateColumns="False" Grid.Column="0" Grid.Row="0" Margin="10" CanUserAddRows="True" CanUserDeleteRows="True" CanUserReorderColumns="False" CanUserSortColumns="True">

 <DataGrid.Columns>
        <DataGridTextColumn Header="{x:Static res:Strings.wndMainColNative}"    Binding="{Binding Native.Text}"  Width="*" />
        <DataGridTextColumn Header="{x:Static res:Strings.wndMainColForeign}"   Binding="{Binding Foreign.Text}" Width="*" />

        <!-- TEST -->
        <DataGridTemplateColumn Header="Test1" Width="*">
            <DataGridTemplateColumn.CellTemplate >
                <DataTemplate>
                    <TextBox Name="testBox" Text="{Binding Path=Foreign.Text, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" ></TextBox>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>

        <DataGridTextColumn Header="{x:Static res:Strings.wndMainColLvlSpeak}"  Binding="{Binding LevelSpeak.Level}"     IsReadOnly="False" />
        <DataGridTextColumn Header="{x:Static res:Strings.wndMainColWrite}"     Binding="{Binding LevelWrite.Level}"     IsReadOnly="False" />
        <DataGridTextColumn Header="{x:Static res:Strings.wndMainColListen}"    Binding="{Binding LevelListen.Level}"    IsReadOnly="False" />
    </DataGrid.Columns>

</DataGrid>

Но я не смог найти, как заменить текстовое поле.

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

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

РЕДАКТИРОВАТЬ:

Иногда решение просто есть, и вы его не видите! Благодаря @ Rekshino

Acutally TextBlock - это элемент управления для использования в режиме отображения, но решение использовало DataGridTemplateColumn:

<DataGridTemplateColumn Header="Test1" Width="*">
    <DataGridTemplateColumn.CellTemplate >
        <DataTemplate>
            <TextBlock Name="testBox" Text="{Binding Path=Foreign.Text, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
    <DataGridTemplateColumn.CellEditingTemplate>
        <DataTemplate>
            <StackPanel >
                <ComboBox SelectedItem="{Binding Path=Foreign.Text}"/>
            </StackPanel>
        </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>

1 Ответ

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

Вы можете использовать DataGridTemplateColumn.CellEditingTemplate для этого:

<DataGridTemplateColumn >
    <DataGridTemplateColumn Header="Test1" Width="*">
        <DataGridTemplateColumn.CellTemplate >
            <DataTemplate>
                <TextBox Name="testBox" Text="{Binding Path=Foreign.Text, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" ></TextBox>
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
    <DataGridTemplateColumn.CellEditingTemplate>
        <DataTemplate>
            <StackPanel >
                <ComboBox ItemsSource="{StaticResource YourListOfWords}" SelectedItem="{Binding Path=Foreign.Text}"/>
            </StackPanel>
        </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
...