【问题标题】:WPF DataGrid ContextMenu data transferWPF DataGrid ContextMenu 数据传输
【发布时间】:2016-01-19 19:56:46
【问题描述】:

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

【问题讨论】:

    标签: c# .net wpf datagrid contextmenu


    【解决方案1】:

    使用DataGrid 的所有列的boolean 属性创建一个类,然后在新窗口中选择它们。例如:

    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;
    

    【讨论】:

    • 有 10 个使用此过滤器的 DataGrid,它们具有不同的列名集。我只是不想重复这个类和其他东西。我想我已经找到了使用 CommandParameter 传递 DataGrid 的方法,但它现在无法正常工作。
    【解决方案2】:

    确实找到了更适合我的答案,但忘记在这里发布了。使用命令和命令参数完成。我在 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,仅在运行程序时应用更改,尚未保存可见性... 太懒了,现在才回节目。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-17
      • 2014-03-02
      • 1970-01-01
      • 1970-01-01
      • 2012-06-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多