2017-02-23 14 views
0

나는 MainWindow을가집니다. 그것은 stackpanel myStack과 다른 것들을 가지고 있습니다. stackPanel에는 프로그래밍 방식으로 추가 된 usercontrol (TaskGrid (_TG))이 있습니다. 이 UserControl에는 4 개의 템플릿 열이있는 DataGrid (dgEmployee)가 있습니다. 마지막 열에는 버튼이 있습니다.프로그래밍 방식으로 mainwindow에서 사용자 정의 컨트롤의 DataGridtemplateColumn에 단추 클릭 이벤트 추가

mainwindow 생성자에서 버튼 클릭 이벤트를 할당하고 여기에서 이벤트를 처리하려고합니다. 의 TaskGrid.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; 

       } 
      } 
     } 
    } 
} 

그리고 에서에서 MainWindow.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까지

답변

1

대기가로드 된 MainWindow.xaml.cs를에 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

나중에 사용자 콘트롤에서 부모로 메인 창 인스턴스를 잡았습니다. 그래서 메인 윈도우에서 그리드의 버튼 클릭 이벤트를 처리하려고하는 방식은 불필요 해졌습니다. 그래서 당신의 코드를 테스트 할 수 없었습니다. 하지만 그것은 논리적으로 옳은 것처럼 보입니다. 그래서 나는 그것을 올바른 답으로 씁니다. 당신의 도움을 주셔서 감사합니다. –