将一个数据网格绑定到另一个数据网格的选定项

本文关键字:网格 数据 数据网 另一个 绑定 一个 | 更新日期: 2023-09-27 18:19:10

我有两个datagrid。EmployeeGrid和WorkSessionsGrid。每个Employee都有一个WorkSessions列表,我希望用户通过在EmployeeGrid中选择一个Item来访问它,这将使WorkSessionsGrid为所选的Employee生成WorkSessions。为什么以下内容不正确?

<DataGrid Name="dg_2" ItemsSource="{Binding ElementName=dg_1, Path=SelectedItem.WorkSessions}"/>

我得出的结论是,问题一定出在另外一个层面上。这是我的代码的剩余部分,希望有人能够帮助我。我是否遗漏了什么重要的东西?

后台代码xaml

    public partial class MainWindow : Window
{
    public EmployeeViewModel EmployeeViewModel = new EmployeeViewModel();

    public MainWindow()
    {
        InitializeComponent();
        menu_employee.DataContext = EmployeeViewModel;
        sp_employee.DataContext = EmployeeViewModel;
        datagrid_employees.ItemsSource = EmployeeViewModel.EmployeesView;
        sp_worksessions.DataContext = EmployeeViewModel.SelectedEmployee.WorkSessions;
        menu_worksession.DataContext = EmployeeViewModel.SelectedEmployee.WorkSessions;
        datagrid_worksessions.ItemsSource = EmployeeViewModel.SelectedEmployee.WorkSessions;
    }
}

WorkSessionViewModel

class WorkSessionViewModel : ViewModelBase
{
    private WorkSessions _workSessionsModel = new WorkSessions();
    public WorkSessions WorkSessionsView = new WorkSessions();
    private WorkSessionModel _selectedWorkSession = new WorkSessionModel();
    public WorkSessionModel SelectedWorkSession
...

WorkSessionModel

[Serializable]
public class WorkSessions : ObservableCollection<WorkSessionModel>
{
    public WorkSessions()
    {
    }
}
[Serializable]
public class WorkSessionModel : INotifyPropertyChanged
{
    private DateTime _dateTime;
    private string _id;
    private double _hours;
    public WorkSessionModel()
    {
    }

将一个数据网格绑定到另一个数据网格的选定项

尝试绑定到元素。

<DataGrid Content="{Binding ElementName=ListOfEmp, Path=SelectedItem.Name}" DataContext="{Binding}" />

这一点XAML看起来很正确,试着调试绑定,可能会有一些其他问题,如视觉树断裂或WorkSessions集合可能是一个字段而不是属性等。

如果有绑定错误请分享

请使用Visual Studio的输出窗口查看任何绑定错误。它们将告诉您绑定是否失败。如果你发现绑定错误,那么你的绑定应该解决两个可能的问题…

  1. 数据源不正确。数据上下文和项目源是否正确地设置了UI元素,如DataGrid ?
  2. 绑定中属性的路径可能不正确。你的SelectedItem有一个对象有任何名为WorkSessions的属性吗?等。

除此之外,我们仍然不知道dg_1dg_2从你的XAML是什么。我猜你的代码后面显示了不同的名称datagrid_employeesdatagrid_worksessions

您应该为EmployeeViewModel再添加一个项目,名为:SelectedEmployee,并将其与员工网格选中的项目mode=TwoWay绑定。

那么第二个网格的数据绑定应该是:

<DataGrid Name="dg_2" ItemsSource="{Binding Path=SelectedEmployee.WorkSessions}"/>

由于两个网格在同一个窗口中,因此,您应该仅为窗口设置数据上下文。在视图模型中,你有2个依赖属性:EmployeeList, selecteemployee。然而,EmployeeList被绑定到员工网格的ItemsSource。selecteemployee被绑定到employee网格上的SelectedItem。