WPF DataGrid ContextMenu 数据传输

WPF DataGrid ContextMenu data transfer

大家好!我是 WPF 和 .NET 的新手,并试图在其中进行认真的应用。在某种程度上,我不知道如何做对,我有 Grid 包含 TabControl 和一些选项卡,在每个选项卡上我都有 DataGrid,数据来自 MySQL。这部分并不难,但现在我需要做一些过滤器,enables/disables 一些列由用户选择。为此,我使用 ContextMenu 在调用时单击带有列名称列表的新 window。在每个选项卡上。所以我做了通用的Filter_Window。我想出了如何获取这些名称,但无法获取需要 Filter_WindowDataGrid。我尝试了 VisualTreeHelper,但是 ContextMenu 有自己的 VisualTree,但它什么也没给我。 DataContext 什么都没有。
只是不想为每个选项卡单独点击,这是不对的,但这是最明显的解决方案。只需要将DataGrid转成Filter_Window.
的方法 对不起我的语言,如果我说不好的话。如果代码示例需要阐明我写的内容 - 说吧,我会 post 一些。

使用 DataGrid 的所有列的 boolean 属性创建一个 class,并在新的 window 中选择它们。例如:

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; }
}

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

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

找到更适合我的答案了,忘了post这里了。使用 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,更改仅在 运行 程序时应用,可见性的保存尚未完成... 太懒了,现在才回来编程