簡體   English   中英

WPF DataGrid ContextMenu數據傳輸

[英]WPF DataGrid ContextMenu data transfer

大家好! 我是WPF和.NET的新手,並試圖在其中進行認真的應用。 在某種程度上,我無法弄清楚該怎么做,我有一個包含帶有某些選項卡的TabControl Grid ,在每個選項卡上,我都有一個DataGrid和MySQL的數據。 這部分並不是那么困難,但是現在我需要做一些過濾器,通過用戶選擇啟用/禁用某些列。 為此,我使用ContextMenu在帶有列名列表的單擊新窗口的調用上。 在每個選項卡上。 所以我做了通用的Filter_Window 我想出了如何獲取此名稱,但無法獲取需要Filter_WindowDataGrid 我嘗試了VisualTreeHelper ,但是ContextMenu擁有它自己的VisualTree,卻沒有給我任何東西。 DataContext沒有提供任何幫助。
只是不想單獨為每個選項卡單擊,這是不對的,但這是最明顯的解決方案。 只需要將DataGrid傳輸到Filter_Window的方法即可。
如果我說的不好,對不起我的語言。 如果代碼示例需要澄清我寫的內容,請說出來,然后我將發布一些內容。

創建一個具有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;

確實找到了更適合我的答案,但忘了在這里發布。 用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>

並將新的Command添加到項目中:

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,僅在運行程序時應用更改,還沒有保存可見性...太懶了,現在才返回程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM