WPF禁止在添加新行之前与DataGrid的TemplateColumn进行交互

时间:2018-10-16 11:01:46

标签: c# wpf wpfdatagrid

例如,考虑将WPF DataGridDataGridTemplateColumn并由用户启动允许添加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>

由于托管了RadioButtonDataGridTemplateColumn可以与之交互,而无需进入CellEditingMode,这是所期望的。
但是,存在一个问题,即最后一个“添加新选项”行类型RadioButton甚至可以在添加新选项之前与交互(即输入添加的名称)。可能选择不存在的选项并将焦点移到其他位置。
radio
在将新行添加到绑定集合之前,如何禁用与模板列的交互?

2 个答案:

答案 0 :(得分:1)

您也可以与NewItemPlaceholder purely in 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>

答案 1 :(得分:0)

您可以使用转换器来实现您想要的目的。

我假设您有一个类或数据类型来表示您的2数据,而8是这些项目的集合。

您可以将Option上的Options设置为:

IsEnabled

而且,转换器代码如下:

RadioButton

您的完整XAML如下所示:

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(); } } 上新行的 <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类型,而不是您的数据类型。