在使用CollectionView定义和绑定时,是否可以隐藏WPF DataGrid中的列?

时间:2012-05-15 17:32:54

标签: c# wpf wpfdatagrid

我正在尝试从这里开始的例子

http://msdn.microsoft.com/en-us/library/ff407126

我想添加一个控件,用户可以定义哪些列可见。这可以轻松完成吗?

我发现http://www.thomaslevesque.com/2011/03/21/wpf-how-to-bind-to-data-when-the-datacontext-is-not-inherited/但它不同,因为它没有使用CollectionView和CollectionViewSource。

谢谢& BR -Matti

1 个答案:

答案 0 :(得分:3)

可以通过多种方式完成。一种方法是编辑Style for DataGrid的列标题。可以在以下位置找到列标题样式的示例:

Change WPF DataGrid Column Header Style, Menu Visibility in Code Behind?

不像上面的文章那样在ControlTemplate中使用菜单,而是可以在此处显示列标题的按钮:

<Button Grid.Column="2" Name="MultiButton" MouseRightButtonDown="MultiButton_MouseRightButtonDown" Click="MultiButton_Click" Visibility="Hidden">X</Button>

按钮用第二个鼠标按钮打开弹出菜单,然后单击将删除该列。默认情况下,该按钮是隐藏的,因此当鼠标移动到列标题时,必须触发按钮才能看到该按钮:

<Trigger Property="IsMouseOver" Value="True" >
    <Setter Property="Visibility" TargetName="DeleteColumn" Value="Visible" />                            
</Trigger>

因为所有列都有按钮,所以click事件必须排除要隐藏的列:

private void MultiButton_Click(object sender, RoutedEventArgs e)
{
   object dataContext = ((FrameworkElement)sender).DataContext;
   foreach (DataGridColumn col in dataGrid1.Columns)
   {
       if (col.Header.ToString() == dataContext.ToString())
       {
           col.Visibility = Visibility.Hidden;
       }
   }
}

这可能不是最好的方法,但它确实有效。