WPF DataGrid ContextMenu 数据传输
WPF DataGrid ContextMenu data transfer
大家好!我是 WPF 和 .NET 的新手,并试图在其中进行认真的应用。在某种程度上,我不知道如何做对,我有 Grid
包含 TabControl
和一些选项卡,在每个选项卡上我都有 DataGrid
,数据来自 MySQL。这部分并不难,但现在我需要做一些过滤器,enables/disables 一些列由用户选择。为此,我使用 ContextMenu
在调用时单击带有列名称列表的新 window。在每个选项卡上。所以我做了通用的Filter_Window
。我想出了如何获取这些名称,但无法获取需要 Filter_Window
的 DataGrid
。我尝试了 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,更改仅在 运行 程序时应用,可见性的保存尚未完成...
太懒了,现在才回来编程
大家好!我是 WPF 和 .NET 的新手,并试图在其中进行认真的应用。在某种程度上,我不知道如何做对,我有 Grid
包含 TabControl
和一些选项卡,在每个选项卡上我都有 DataGrid
,数据来自 MySQL。这部分并不难,但现在我需要做一些过滤器,enables/disables 一些列由用户选择。为此,我使用 ContextMenu
在调用时单击带有列名称列表的新 window。在每个选项卡上。所以我做了通用的Filter_Window
。我想出了如何获取这些名称,但无法获取需要 Filter_Window
的 DataGrid
。我尝试了 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,更改仅在 运行 程序时应用,可见性的保存尚未完成... 太懒了,现在才回来编程