C# 将行详细信息显示为datagrid

C# 将行详细信息显示为datagrid,c#,wpf,datagrid,detailview,C#,Wpf,Datagrid,Detailview,我有一个datagrid,其中的项目是列表(只是一个更容易理解的示例): 公共类人物 { 公共字符串名{get;set;} 公共字符串LastName{get;set;} 上市公司{get;set;} } 公营公司 { 公共字符串名称{get;set;} 公共字符串City{get;set;} } 现在我想在我的RowDetailsTemplate中显示公司 我试过这么做 <DataGrid.RowDetailsTemplate> <DataTemplate&

我有一个datagrid,其中的项目是列表(只是一个更容易理解的示例):

公共类人物
{
公共字符串名{get;set;}
公共字符串LastName{get;set;}
上市公司{get;set;}
}
公营公司
{
公共字符串名称{get;set;}
公共字符串City{get;set;}
}
现在我想在我的RowDetailsTemplate中显示公司

我试过这么做

<DataGrid.RowDetailsTemplate>
        <DataTemplate>
            <DataGrid ItemsSource="{Binding Companies}">
                [im trying to access the data of the row here]
            </DataGrid>
        </DataTemplate>
</DataGrid.RowDetailsTemplate>

[我试图在此处访问该行的数据]
datagrid的my ItemsSource是一个列表(它是只读的,只用于显示,不用于编辑数据)

我的问题是,我似乎无法访问这些公司,而VS/R只表示
列表(在我的viewModel中包含人员姓名)可用


但是我想访问每行的数据,而不是每行的数据。我该怎么做呢?

让我用一个例子来解释一下。复制粘贴以下代码,并将断点放在
SelectedEmployee
get
set

现在运行代码并单击其他行。您将获得包含详细信息列表的保留行项目

main window.xaml

    <DataGrid ItemsSource="{Binding Employees}" SelectedItem="{Binding SelectedEmployee}" >
        <DataGrid.RowDetailsTemplate>
            <DataTemplate>
                <DataGrid ItemsSource="{Binding Details}"/>
            </DataTemplate>
        </DataGrid.RowDetailsTemplate>
    </DataGrid>

MainWindow.xaml.cs

/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        var detail1 = new EmployeeDetails() { ManagerID = 11, ManagerName = "11 Name", ManagerMobile = "123456" };
        var detail2 = new EmployeeDetails() { ManagerID = 12, ManagerName = "12 Name", ManagerMobile = "123456" };
        var detail3 = new EmployeeDetails() { ManagerID = 13, ManagerName = "13 Name", ManagerMobile = "123456" };

        var detail4 = new EmployeeDetails() { ManagerID = 11, ManagerName = "11 Name", ManagerMobile = "123456" };
        var detail5 = new EmployeeDetails() { ManagerID = 12, ManagerName = "12 Name", ManagerMobile = "123456" };
        var detail6 = new EmployeeDetails() { ManagerID = 13, ManagerName = "13 Name", ManagerMobile = "123456" };

        var detail7 = new EmployeeDetails() { ManagerID = 11, ManagerName = "11 Name", ManagerMobile = "123456" };
        var detail8 = new EmployeeDetails() { ManagerID = 12, ManagerName = "12 Name", ManagerMobile = "123456" };
        var detail9 = new EmployeeDetails() { ManagerID = 13, ManagerName = "13 Name", ManagerMobile = "123456" };

        var details1 = new List<EmployeeDetails>();
        details1.Add(detail1);
        details1.Add(detail2);
        details1.Add(detail3);

        var details2 = new List<EmployeeDetails>() { detail4, detail5, detail6 };
        var details3 = new List<EmployeeDetails>() { detail7, detail8, detail9 };

        Employees = new List<Employee>();
        Employees.Add(new Employee() { ID = 1, Name = "Name1", Details = details1 });
        Employees.Add(new Employee() { ID = 2, Name = "Name2", Details = details2 });
        Employees.Add(new Employee() { ID = 3, Name = "Name3", Details = details3 });            

        SelectedEmployee = Employees[1];

        this.DataContext = this;
    }

    public List<Employee> Employees { get; set; }

    private Employee _selected;

    public Employee SelectedEmployee
    {
        get { return _selected; }
        set { _selected = value; }
    }


}

public class Employee
{
    public int ID { get; set; }
    public string Name { get; set; }
    public List<EmployeeDetails> Details { get; set; }
}

public class EmployeeDetails
{
    public int ManagerID { get; set; }
    public string ManagerName { get; set; }
    public string ManagerMobile { get; set; }

}
//
///MainWindow.xaml的交互逻辑
/// 
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
var detail1=newemployeedetails(){ManagerID=11,ManagerName=“11 Name”,ManagerMobile=“123456”};
var detail2=newemployeedetails(){ManagerID=12,ManagerName=“12 Name”,ManagerMobile=“123456”};
var detail3=newemployeedetails(){ManagerID=13,ManagerName=“13 Name”,ManagerMobile=“123456”};
var detail4=newemployeedetails(){ManagerID=11,ManagerName=“11 Name”,ManagerMobile=“123456”};
var detail5=newemployeedetails(){ManagerID=12,ManagerName=“12 Name”,ManagerMobile=“123456”};
var detail6=newemployeedetails(){ManagerID=13,ManagerName=“13 Name”,ManagerMobile=“123456”};
var detail7=newemployeedetails(){ManagerID=11,ManagerName=“11 Name”,ManagerMobile=“123456”};
var detail8=newemployeedetails(){ManagerID=12,ManagerName=“12 Name”,ManagerMobile=“123456”};
var detail9=newemployeedetails(){ManagerID=13,ManagerName=“13 Name”,ManagerMobile=“123456”};
var details1=新列表();
详情1.添加(详情1);
详情1.添加(详情2);
详情1.添加(详情3);
var details2=新列表(){detail4,detail5,detail6};
var details3=新列表(){detail7,detail8,detail9};
雇员=新名单();
Add(new Employee(){ID=1,Name=“Name1”,Details=details1});
Add(newemployee(){ID=2,Name=“Name2”,Details=details2});
Add(newemployee(){ID=3,Name=“Name3”,Details=details3});
所选员工=员工[1];
this.DataContext=this;
}
公共列表雇员{get;set;}
选择私人雇员;
公共雇员选定雇员
{
获取{return\u selected;}
设置{u selected=value;}
}
}
公营雇员
{
公共int ID{get;set;}
公共字符串名称{get;set;}
公共列表详细信息{get;set;}
}
公共类雇员详细信息
{
public int ManagerID{get;set;}
公共字符串管理器名称{get;set;}
公共字符串管理器移动{get;set;}
}

那么您想访问所选行的详细信息(公司)吗?你在MVVM吗?是的,是的。如果有帮助的话,我用棱镜。相反,我计划以任何方式显示所有详细信息,但这是RowDetailsTemplate提供的功能,但我想访问我的行的数据,这里我的行是什么意思?你知道,每一行都由一个ViewModel表示。此viewmodel有一个公司列表。我希望这些公司在该行的详细视图中位于datagrid中。我的行不具体,每行都是一样的。你已经这样做了。每一行都表示为
个人
,该行的详细信息将显示相应行的公司列表
公司
。非常感谢。有时候你只需要有人指出你很笨。然而,如果我没有正确的方法,它就会解决我的问题。回答得好!
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        var detail1 = new EmployeeDetails() { ManagerID = 11, ManagerName = "11 Name", ManagerMobile = "123456" };
        var detail2 = new EmployeeDetails() { ManagerID = 12, ManagerName = "12 Name", ManagerMobile = "123456" };
        var detail3 = new EmployeeDetails() { ManagerID = 13, ManagerName = "13 Name", ManagerMobile = "123456" };

        var detail4 = new EmployeeDetails() { ManagerID = 11, ManagerName = "11 Name", ManagerMobile = "123456" };
        var detail5 = new EmployeeDetails() { ManagerID = 12, ManagerName = "12 Name", ManagerMobile = "123456" };
        var detail6 = new EmployeeDetails() { ManagerID = 13, ManagerName = "13 Name", ManagerMobile = "123456" };

        var detail7 = new EmployeeDetails() { ManagerID = 11, ManagerName = "11 Name", ManagerMobile = "123456" };
        var detail8 = new EmployeeDetails() { ManagerID = 12, ManagerName = "12 Name", ManagerMobile = "123456" };
        var detail9 = new EmployeeDetails() { ManagerID = 13, ManagerName = "13 Name", ManagerMobile = "123456" };

        var details1 = new List<EmployeeDetails>();
        details1.Add(detail1);
        details1.Add(detail2);
        details1.Add(detail3);

        var details2 = new List<EmployeeDetails>() { detail4, detail5, detail6 };
        var details3 = new List<EmployeeDetails>() { detail7, detail8, detail9 };

        Employees = new List<Employee>();
        Employees.Add(new Employee() { ID = 1, Name = "Name1", Details = details1 });
        Employees.Add(new Employee() { ID = 2, Name = "Name2", Details = details2 });
        Employees.Add(new Employee() { ID = 3, Name = "Name3", Details = details3 });            

        SelectedEmployee = Employees[1];

        this.DataContext = this;
    }

    public List<Employee> Employees { get; set; }

    private Employee _selected;

    public Employee SelectedEmployee
    {
        get { return _selected; }
        set { _selected = value; }
    }


}

public class Employee
{
    public int ID { get; set; }
    public string Name { get; set; }
    public List<EmployeeDetails> Details { get; set; }
}

public class EmployeeDetails
{
    public int ManagerID { get; set; }
    public string ManagerName { get; set; }
    public string ManagerMobile { get; set; }

}