如何以编程方式访问数据网格行详细信息控件

时间:2010-08-10 20:09:02

标签: wpf datagrid rowdetails

我有一个带有一些已定义列的数据网格,然后是一个行详细信息模板。如何在后面的代码中访问行详细信息模板中的控件?我有一个按钮,我想以编程方式启用/禁用,但我无法弄清楚如何在后面的代码中访问它。我在MSDN上看过这个:

http://msdn.microsoft.com/en-us/library/bb613579.aspx

但这只是描述常规数据模板,所以当我尝试它时它不起作用。我的情况是行详细信息数据模板。当然有人编写代码来访问数据网格行详细信息模板中的控件,该模板可以对此进行评论(非常感谢)。

3 个答案:

答案 0 :(得分:8)

好的,我想出了如何实现这一点我必须调整原始问题中MSDN文章中发布的代码....

DataGridRow row = (DataGridRow)(KeywordsGrid.ItemContainerGenerator.ContainerFromItem(KeywordsGrid.SelectedItem));

// Getting the ContentPresenter of the row details
DataGridDetailsPresenter presenter = FindVisualChild<DataGridDetailsPresenter>(row);

// Finding Remove button from the DataTemplate that is set on that ContentPresenter
DataTemplate template = presenter.ContentTemplate;
Button button = (Button)template.FindName("RemoveItemButton", presenter);

“KeywordsGrid”是绑定到我的数据网格的变量。请注意,在我调用FindVisualChild时,我使用的是“DataGridDetailsPresenter”类,而不是“ContentPresenter”(这是关键...它强制FindVisualChild方法一直遍历所有内容提供者,直到我到达行详情)。

答案 1 :(得分:1)

您是否可以在网格中显示的对象类型上定义(或者是否存在)属性,该属性表示按钮的启用状态?如果是,那么修改行详细信息模板以将按钮的IsEnabled属性绑定到该属性会更加简单。

答案 2 :(得分:1)

使用DataGrid.LoadingRowDetails事件!它更直接。

我在这里找到了这个: How to change Text of TextBlock which is in DataTemplate of Row Details for each DataGrid Row Details?

示例:

XAML

<DataGrid.RowDetailsTemplate>
     <DataTemplate>
         <TextBlock x:Name="Test">Test</TextBlock>
         </DataTemplate>
</DataGrid.RowDetailsTemplate>

C#

private void dgVehicles_LoadingRowDetails(object sender, DataGridRowDetailsEventArgs e)
{
    TextBlock tbTest = e.DetailsElement.FindName("Test") as TextBlock;
    if (tbTest != null)
    {
        tbTest.Text = "Juhuu";
    }
}