例如,考虑将WPF DataGrid
与DataGridTemplateColumn
并由用户启动允许添加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
甚至可以在添加新选项之前与交互(即输入添加的名称)。可能选择不存在的选项并将焦点移到其他位置。
在将新行添加到绑定集合之前,如何禁用与模板列的交互?
答案 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
类型,而不是您的数据类型。