WPF отключает взаимодействие с DataGrid TemplateColumn для новых строк перед их добавлением - PullRequest
0 голосов
/ 16 октября 2018

Рассмотрим WPF DataGrid с DataGridTemplateColumn (s) и с инициированным пользователем добавлением CanUserAddRows="True", например,

<DataGrid AutoGenerateColumns="False" CanUserAddRows="True" ItemsSource="{Binding Options}">
    <DataGrid.Columns>
        <DataGridTemplateColumn>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <RadioButton IsChecked="{Binding IsChecked}" GroupName="OptionsRad"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTextColumn Header="Option" Binding="{Binding OptionName}"/>
    </DataGrid.Columns>
</DataGrid>

RadioButton благодаря размещению DataGridTemplateColumn может бытьвзаимодействовал с без ввода CellEditingMode, что ожидается и желательно.
Однако существует проблема, заключающаяся в том, что в последнем «добавить новую опцию» типа строки с RadioButton можно взаимодействовать с даже до добавления новой опции (т.е. будетдобавлено имя введено).Возможно, выбрав несуществующий вариант и перенеся фокус в другое место.
radio
Как отключить взаимодействие со столбцом шаблона перед добавлением новой строки в связанную коллекцию?

Ответы [ 2 ]

0 голосов
/ 24 июля 2019

Вы можете сравнить с NewItemPlaceholder только в XAML :

<DataTemplate>
    <RadioButton x:Name="Radio" IsChecked="{Binding IsChecked}" GroupName="OptionsRad" />
    <DataTemplate.Triggers>
        <DataTrigger Binding="{Binding Item, RelativeSource={RelativeSource FindAncestor, AncestorType=DataGridRow}}"
                     Value="{x:Static CollectionView.NewItemPlaceholder}">
            <Setter TargetName="Radio" Property="IsEnabled" Value="False" />
        </DataTrigger>
    </DataTemplate.Triggers>
</DataTemplate>
0 голосов
/ 16 октября 2018

Вы можете использовать конвертер для достижения того, что вы пытаетесь сделать.

Я предположил, что у вас есть класс или тип данных для представления ваших Option данных, а Options представляет собой набор этих элементов.

Вы можете установить IsEnabled на RadioButton на:

IsEnabled="{Binding Path=Item, RelativeSource={RelativeSource AncestorType=DataGridRow"}, Converter={StaticResource DataToEnabledConverter}}"

И код конвертера будет выглядеть так:

public class DataToEnabledConverter : IValueConverter
{
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
     {
         return value is Option;
     }

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
     {
         throw new NotImplementedException();
     }
}

Ваш полный XAML будет выглядетькак:

    <DataGrid AutoGenerateColumns="False" CanUserAddRows="True" ItemsSource="{Binding Options}">
        <DataGrid.Columns>
            <DataGridTemplateColumn>
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <RadioButton IsChecked="{Binding IsChecked}" GroupName="OptionsRad" 
                                     IsEnabled="{Binding Path=Item, RelativeSource={RelativeSource AncestorType=DataGridRow"}, Converter={StaticResource DataToEnabledConverter}}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTextColumn Header="Option" Binding="{Binding OptionName}"/>
        </DataGrid.Columns>
    </DataGrid>

Это работает, потому что свойство Item для DataGridRow для новых строк будет иметь тип NamedObject, а не тип данных.

...