2017-02-23 77 views
0

我有一個MainWindow。它有一個堆棧面板myStack和其他一些東西。 在stackPanel中,以編程方式添加了一個用戶控件(TaskGrid(_TG))。 在這個UserControl中,有一個DataGrid(dgEmployee),它有4個模板列。最後一列包含一個按鈕。以編程方式從mainwindow在用戶控件的datagridtemplatecolumn中添加按鈕單擊事件

我想從主窗口構造函數中分配按鈕單擊事件,並在這裏處理事件。

這裏是代碼:

MainWindow.xaml

<Grid Grid.Row="2"> 
    <StackPanel Name="myStack"/> 
</Grid> 

MainWindow.xaml.cs

public MainWindow() 
{ 
    InitializeComponent(); 
    _TG = new TaskGrid(); 
    _TD = new _1.TaskDetails(); 
    _TM = new _1.TaskMaster(); 
    myStack.Children.Add(_TG); 
    _AUC = ActiveUserControl.Grid; 

    foreach (object child in myStack.Children) 
    { 
     string childname = ""; 
     if (child is FrameworkElement) 
     { 
      childname = (child as FrameworkElement).Name; 
      if (childname == "TaskGrid") 
      { 
       Grid dg = ((Grid)((UserControl)child).Content); 
       foreach (var item in dg.Children) 
       { 
        DataGridColumn b = ((DataGrid)item).Columns[3] as DataGridColumn; 

       } 
      } 
     } 
    } 
} 

而且在TaskGrid.xaml,則此處僅給出模板列

<DataGridTemplateColumn Width="30"> 
    <DataGridTemplateColumn.CellTemplate> 
     <ItemContainerTemplate> 
      <Button Name="btnMaster" Background="Transparent"> 
       <Button.Template> 
        <ControlTemplate> 
         <Image Source="ArrowRight.png"/> 
        </ControlTemplate> 
       </Button.Template> 
      </Button> 
     </ItemContainerTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 

我必須分配click事件像

button.click += new RoutedEvent(button_click); 

後來在

回答

1

等到UserControl已經加載了MainWindow.xaml.cs使用button_click事件。然後,您可以使用以下幫助器方法獲取對DataGrid的引用,該方法在可視樹中以遞歸方式搜索特定類型的元素。

private static T GetChildOfType<T>(DependencyObject depObj) where T : DependencyObject 
{ 
    if (depObj == null) 
     return null; 

    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++) 
    { 
     var child = VisualTreeHelper.GetChild(depObj, i); 

     var result = (child as T) ?? GetChildOfType<T>(child); 
     if (result != null) return result; 
    } 
    return null; 
} 

用同樣的方法,你可以得到一個特定的單元格的引用:

public static DataGridCell GetCell(DataGrid dataGrid, DataGridRow rowContainer, int column) 
{ 
    if (rowContainer != null) 
    { 
     System.Windows.Controls.Primitives.DataGridCellsPresenter presenter = 
      GetChildOfType<System.Windows.Controls.Primitives.DataGridCellsPresenter>(rowContainer); 
     if (presenter != null) 
      return presenter.ItemContainerGenerator.ContainerFromIndex(column) as DataGridCell; 
    } 
    return null; 
} 

請參考下面的博客文章,瞭解更多有關這個:https://blog.magnusmontin.net/2013/11/08/how-to-programmatically-select-and-focus-a-row-or-cell-in-a-datagrid-in-wpf/

下面是一個完整的例子爲你。請注意,DataGrid可能包含多行,並且某些行可能已被虛擬化。您可以在上面的鏈接中找到關於此的更多信息。

public MainWindow() 
{ 
    InitializeComponent(); 

    _TG = new TaskGrid(); 
    _TD = new _1.TaskDetails(); 
    _TM = new _1.TaskMaster(); 
    myStack.Children.Add(_TG); 
    _AUC = ActiveUserControl.Grid; 

    _TG.Loaded += (s, e) => 
    { 
     DataGrid dataGrid = GetChildOfType<DataGrid>(_TG); 
     if (dataGrid != null) 
     { 
      foreach (var item in dataGrid.Items) 
      { 
       DataGridRow dgr = dataGrid.ItemContainerGenerator.ContainerFromItem(item) as DataGridRow; 
       if (dgr != null) 
       { 
        DataGridCell cell = GetCell(dataGrid, dgr, 3); //<-- column index 
        if (cell != null) 
        { 
         Button button = GetChildOfType<Button>(cell); 
         if (button != null) 
         { 
          button.Click += new RoutedEvent(button_click); 
         } 
        } 
       } 
      } 
     } 
    }; 
} 
+0

後來我從usercontrol捕獲了主窗口實例作爲父窗口。所以我試圖從主窗口處理網格中的按鈕單擊事件的方式變得沒有必要。所以我無法測試你的代碼。但從邏輯上來看似乎是對的,所以我把它作爲一個正確的答案。謝謝你的幫助。 –

相關問題