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