Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 如何以编程方式访问datagrid行详细信息控件_Wpf_Datagrid_Rowdetails - Fatal编程技术网

Wpf 如何以编程方式访问datagrid行详细信息控件

Wpf 如何以编程方式访问datagrid行详细信息控件,wpf,datagrid,rowdetails,Wpf,Datagrid,Rowdetails,我有一个datagrid,其中包含一些已定义的列,然后是一个行详细信息模板。如何访问代码隐藏中的行详细信息模板中的控件?我有一个按钮,我想以编程方式启用/禁用,但我不知道如何在代码中访问它。我在MSDN上看到了这一点: 但这只是描述一个常规的数据模板,所以当我尝试这样做时,它并没有起作用。我的案例是一个行详细信息数据模板。肯定有人编写了代码来访问datagrid row details模板中的控件,该模板可以对此进行注释(非常感谢)。您能否定义(或是否已经存在)网格中显示的对象类型的属性,该属

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


但这只是描述一个常规的数据模板,所以当我尝试这样做时,它并没有起作用。我的案例是一个行详细信息数据模板。肯定有人编写了代码来访问datagrid row details模板中的控件,该模板可以对此进行注释(非常感谢)。

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

好的,我知道了如何实现这一点,我必须调整原始问题中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);
DataGridRow行=(DataGridRow)(关键字grid.ItemContainerGenerator.ContainerFromItem(关键字grid.SelectedItem));
//获取行详细信息的ContentPresenter
DataGridDetailsPresenter=FindVisualChild(行);
//正在从该ContentPresenter上设置的DataTemplate中查找“删除”按钮
DataTemplate=presenter.ContentTemplate;
Button Button=(Button)template.FindName(“RemoveItemButton”,presenter);

KeywordsGrid
是绑定到my
DataGrid
的变量。请注意,在我调用
FindVisualChild
时,我使用了
DataGridDetailsPresenter
类,而不是
ContentPresenter
(这是关键……它迫使
FindVisualChild
方法在所有内容演示器中迭代,直到我找到行详细信息的一个).

使用DataGrid.LoadingRowDetails事件!这更直截了当

我在这里找到了这个:

例如:

xaml


是的,在我的视图模型中,我可以在用于datagrid的类中拥有一个属性。所以这是一种方法。我刚刚在代码隐藏类中也找到了如何实现这一点。我将把它作为一个单独的答案发布。谢谢你的回复!
<DataGrid.RowDetailsTemplate>
     <DataTemplate>
         <TextBlock x:Name="Test">Test</TextBlock>
         </DataTemplate>
</DataGrid.RowDetailsTemplate>
private void dgVehicles_LoadingRowDetails(object sender, DataGridRowDetailsEventArgs e)
{
    TextBlock tbTest = e.DetailsElement.FindName("Test") as TextBlock;
    if (tbTest != null)
    {
        tbTest.Text = "Juhuu";
    }
}