2017-02-23 3 views
0

私はMainWindowを持っています。それはスタックパネルmyStackと他のものを持っています。 stackPanelには、プログラムで追加されたユーザーコントロール(TaskGrid(_TG))があります。 このUserControlには、4つのテンプレート列を持つDataGrid(dgEmployee)があります。最後の列にはボタンがあります。メインウィンドウからユーザコントロールのDataGridtemplateColumnにボタンクリックイベントをプログラムで追加する

メインウィンドウのコンストラクタからボタンのクリックイベントを割り当てて、ここでイベントを処理しようとしています。ここで

はコードです:

MainWindow.xamlMainWindow.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中で

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

、テンプレート列のみがここに与えられる

<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> 

私は

button.click += new RoutedEvent(button_click); 

などのクリックイベントを割り当て、後でUserControlがロードされるまでMainWindow.xaml.cs

答えて

1

待ちでbutton_clickイベントを使用する必要があります。次に、ビジュアルツリーで特定の型の要素を再帰的に検索するヘルパーメソッドを使用して、DataGridへの参照を取得できます。

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/は完全な例である

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; 
} 

同じように、あなたは、特定のセルへの参照を取得することができますあなたのために。 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から親ウィンドウとしてメインウィンドウインスタンスを取得しました。だから、私はメインウィンドウからグリッドのボタンクリックイベントを処理しようとしていたが、不要になる。だから私はあなたのコードをテストすることができませんでした。しかし、論理的に正しいと思われるので、私は正しい答えとしてそれを置きます。ご協力いただきありがとうございます。 –

関連する問題