10

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

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

但这只是描述一个常规的数据模板,所以当我尝试它时它不起作用。我的案例是行详细信息数据模板。肯定有人编写了代码来访问数据网格行详细信息模板中的控件,该模板可以对此进行评论(将不胜感激)。

4

3 回答 3

9

好的,我想出了如何让这个工作我不得不调整在原始问题的 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是绑定到我的变量DataGrid。请注意,在我对 的调用中FindVisualChild,我使用的是一个DataGridDetailsPresenter类而不是一个ContentPresenter(这是关键......它迫使该FindVisualChild方法一直遍历所有内容演示者,直到我找到行详细信息的那个)。

于 2010-08-10T21:28:13.143 回答
2

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

我在这里找到了这个: 如何更改每个 DataGrid 行详细信息的行详细信息的 DataTemplate 中的 TextBlock 的文本?

例子:

xml

<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";
    }
}
于 2012-08-03T13:59:16.807 回答
1

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

于 2010-08-10T20:41:28.217 回答