我有一个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文章,但这看起来有点极端。我很好奇是否有一个更简单的方法只隐藏“新行”上的按钮。谢谢你的帮助。
答案 0 :(得分:9)
如果是我,我会写一个快速转换器来确定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, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
然后我会将一个RelativeSource绑定添加到Delete Button Visibility:
<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实例。可能很明显,但值得一提。 :)