WPF DataGrid ContextMenu数据传输

时间:2016-01-19 19:56:47

标签: c# .net wpf datagrid contextmenu

大家好日子!我是WPF和.NET的新手,并尝试在其中进行认真的应用。在某种程度上,我无法确定如何正确,我有 Grid 包含 TabControl 和一些标签,在每个标签上我使用来自MySQL的数据 DataGrid 。这部分并不是那么困难,但现在我需要制作一些过滤器,通过用户选择启用/禁用某些列。为此,我使用 ContextMenu 在点击新窗口上调用列名列表。在每个选项卡上。所以我做了普遍的 Filter_Window 。我想了解如何获取此名称,但无法获得 DataGrid ,这需要 Filter_Window 。我尝试了 VisualTreeHelper ,但是 ContextMenu 拥有它自己的VisualTree,它没有给我任何东西。 DataContext 没有给任何东西。只是不想单独为每个标签制作点击,这不对,但这是最明显的解决方案。只需要将 DataGrid 转移到 Filter_Window 的方式。
对不起我的语言,如果我说不好的话。如果代码示例需要澄清我写的内容 - 说,我会发布一些。

2 个答案:

答案 0 :(得分:0)

创建一个包含boolean所有列DataGrid属性的类,并在新窗口中选择它们。例如:

public class ColumnChooser
{        
    public bool IsShowIdStudent { get; set; }
    public bool IsShowFirstName { get; set; }
    public bool IsShowLastName { get; set; }
    public bool IsShowGroup { get; set; }
    public bool IsShowUniversity { get; set; }
}

之后,您可以根据存储布尔值的类为您的列设置Visibility

YourDataGrid.Columns[IndexOftheColumn].Visibility = Visibility.Collapsed;

答案 1 :(得分:0)

发现更适合我回答,但忘了在这里发帖。使用Command和CommandParameter完成。我在MainWindow的XAML中做了什么:

<DataGrid.ContextMenu>
  <ContextMenu DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}">
    <MenuItem x:Name ="AktFilter" Header="_Фильтры..." Command="{StaticResource ResourceKey=FilterCommand}" CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}, Path=PlacementTarget}"/>
  </ContextMenu>
</DataGrid.ContextMenu>

并将新命令添加到项目中:

class FilterCommand : ICommand
{
    public bool CanExecute(object parameter)
    {
        return true;
    }
    public event EventHandler CanExecuteChanged
    public void Execute(object parameter)
    {
        if (parameter != null)
        {
            FilterWindow newW = new FilterWindow();
            newW.Owner = Application.Current.MainWindow;
            newW._sender = parameter as DataGrid;
            newW.ShowDialog();//можно через условие нажатия на ок попробовать запилить обработку сохранения или !!!!! смену состояния строк
            if (newW.DialogResult == true)
            {
                DataGrid dg = parameter as DataGrid;
                Filters filterList = (Filters)newW.FilterDG.ItemsSource;
                for (int i = 0; i < dg.Columns.Count; i++)
                {
                    if (filterList[i].Visible)
                    {
                        dg.Columns[i].Visibility = Visibility.Visible;
                    }
                    else
                    {
                        dg.Columns[i].Visibility = Visibility.Collapsed;
                    }
                    //тут еще засунуть фильтры!!!
                }
            }
        }
    }
}  

此代码从列名和复选框生成DataGrid,仅在运行程序时应用更改,可见性保存尚未完成... 太懒了,现在才回到节目中。