代码之家  ›  专栏  ›  技术社区  ›  wondra

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

  •  0
  • wondra  · 技术社区  · 7 年前

    考虑一个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的情况下进行交互,这是预期和期望的。
    但是,问题是,在最后一行的“addnewoption”类型 单选按钮 可以与交互 (即,如果输入了名称,将被添加)。可能会选择不存在的选项并将焦点移到其他地方。
    radio

    1 回复  |  直到 7 年前
        1
  •  0
  •   Suresh    7 年前

    你可以用一个转换器来实现你想做的事情。

    我假设您有一个类或数据类型来表示您的 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 ,不是您的数据类型。

        2
  •  1
  •   Miral    7 年前

    你可以和 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>