我有一个
WPF Datagrid,它有一个模板列,如下所示:
<DataGridTemplateColumn x:Name="ciDelete" Header="Delete"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Button x:Name="btnDelete" HorizontalAlignment="Center" Margin="0" Click="btnDelete_Click" Tag="{Binding Path=ciID}" VerticalAlignment="Center"> <Image Source="Resources/16x16/delete.png" Stretch="Fill" /> </Button> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn>
这显示并且效果很好.但是,按钮会在行中显示新项目(如下所示).由于这是一个删除按钮,我不希望它显示在“新项目”行上.
我看过this关于造型新行的文章,但这看起来有点极端.我很好奇是否有一个更简单的方法只隐藏“新行”上的按钮.谢谢您的帮助.
解决方法
如果是我,我会写一个快速转换器来确定DataGridRow的datacontext是否是NewItemPlaceholder:
public class IsNamedObjectVisibilityConverter : IValueConverter { public object Convert(object value,Type targetType,object parameter,System.Globalization.CultureInfo culture) { if (value.GetType().Name == "NamedObject") { return Visibility.Hidden; } else { return Visibility.Visible; } } public object ConvertBack(object value,System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } }
然后我将一个RelativeSource绑定添加到删除按钮可见性:
<DataGridTemplateColumn x:Name="ciDelete" Header="Delete"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Button x:Name="btnDelete" HorizontalAlignment="Center" Margin="0" Click="btnDelete_Click" Tag="{Binding Path=ciID}" VerticalAlignment="Center" Visibility="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=DataGridRow},Path=DataContext,Converter={StaticResource IsNamedObjectVisibilityConverter}}"> <Image Source="Resources/16x16/delete.png" Stretch="Fill" /> </Button> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn>
这可能是也可能不是最好的方法,但应该有效.
我希望这有帮助.
编辑:我希望很明显,为了简洁起见,我跳过了创建所述转换器实例的部分.此示例假定您具有类的确切名称的Converter实例.可能很明显,但值得一提.