以编程方式从主窗口添加用户控件中的datagridtemplatecolumn中的按钮单击事件

时间:2017-02-23 16:39:21

标签: c# wpf datagrid user-controls datagridtemplatecolumn

我有 MainWindow 。它有一个stackpanel myStack 和其他一些东西。 在stackPanel中,以编程方式添加了usercontrol( TaskGrid(_TG))。 在此UserControl中,有一个DataGrid(dgEmployee),它有4个模板列。最后一列包含一个按钮。

我正在尝试从主窗口构造函数中分配按钮单击事件并在此处理事件。

以下是代码:

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>

我必须分配点击事件,如

button.click += new RoutedEvent(button_click);

稍后在MainWindow.xaml.cs中使用button_click事件

1 个答案:

答案 0 :(得分:1)

等到UserControl已加载。然后,您可以使用以下帮助方法获取对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);
                        }
                    }
                }
            }
        }
    };
}
相关问题