2016-01-19 72 views
0

美好的一天給大家!我是新來的WPF和.NET,並試圖在其中認真應用。在第一部分,我找不出如何讓正確的,我有Grid包含TabControl一些標籤,每個標籤上我有DataGrid與MySQL的數據。這部分不是那麼難,但現在我需要做一些過濾,通過用戶選擇啓用/禁用某些列。爲此,我使用ContextMenu,在調用時單擊帶有列名稱列表的新窗口。在每個標籤上。所以我做了普遍的Filter_Window。我想如何得到這個名字,但不能得到DataGrid,那要求Filter_Window。我試過VisualTreeHelper,但ContextMenu有它自己的VisualTree,它沒有給我任何東西。 DataContext沒有給出任何意見。
只是不想單獨爲每個標籤點擊,這是不正確的,但它是最明顯的解決方案。只需要將DataGrid轉換爲Filter_Window
對不起,我的語言不好,如果代碼示例需要澄清我寫的內容 - 說,我會張貼一些。WPF DataGrid ContextMenu數據傳輸

回答

0

沒有找到更適合我回答,卻忘了在這裏發佈。用Command和CommandParameter完成。我在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,運行程序時只適用修改後,保存的能見度尚未完成... 太懶惰,現在只能回到程序。

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; 
+0

有10個DataGrid使用此過濾器,並且它們具有不同的一組列名稱。我只是不想複製這些類和其他東西。我想我已經找到了用CommandParameter傳遞DataGrid的方法,但現在它不能正常工作。 –