如何根据数据网格的选定项设置多个元素的数据上下文?

本文关键字:数据 设置 元素 上下文 何根 数据网 网格 | 更新日期: 2023-09-27 18:19:11

我再一次请求你,stackoverflow,在我需要的时候。

我试图将工具栏,菜单和DataGrid(datagrid_worksessions)绑定到另一个DataGrid(datagrid_employees)的选定项目。棘手的部分是,我需要工具栏和菜单绑定到元素的ViewModel层,而DataGrid绑定到特定对象的模型层。

这是我的ViewLayer的Code-Behind。

namespace SalaryApplication
{
public partial class MainWindow : Window
{
    public EmployeeViewModel EmployeeViewModel = new EmployeeViewModel();
    private ObservableCollection<WorkSessionModel> SelectedWorkSessions = new ObservableCollection<WorkSessionModel>();

    public MainWindow()
    {
        InitializeComponent();
        menu_employee.DataContext = EmployeeViewModel;
        sp_employee.DataContext = EmployeeViewModel;
        datagrid_employees.ItemsSource = EmployeeViewModel.EmployeesView;
        sp_worksessions.DataContext = EmployeeViewModel.WorkSessionViewModel;
        menu_worksession.DataContext = EmployeeViewModel.WorkSessionViewModel;

    }
    private void datagrid_employees_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
    {
        grid_selectedEmployee.DataContext = EmployeeViewModel.SelectedEmployee;
        SelectedWorkSessions = EmployeeViewModel.SelectedEmployee.WorkSessions;
        datagrid_worksessions.ItemsSource = SelectedWorkSessions;
    }
}
}

如何根据数据网格的选定项设置多个元素的数据上下文?

DataContext是一个可继承的依赖属性,这意味着如果你为父GUI设置了它,那么所有的子元素都会自动获取它。

因此,在您的情况下,只需设置窗口'用户控件的数据上下文将使menu_employee, sp_employee, datagrid_employees, sp_worksessions, menu_worksessiongrid_selectedEmployee(假设它们不是任何ItemsControl的一部分)自动获取它。

一旦获得了数据上下文,接下来的问题就是使用BindingPath从数据上下文映射到相关的对象。

下面的例子会告诉你…(仅作说明之用)

   <Window ... >
       <Menu ItemsSource="{Binding MenuItems}" ... />
       <StackPanel>
            <DataGrid ItemsSource="{Binding Employees}"/>
            <DockPanel DataContext="{Binding SelectedEmployee}">
                <TextBlock Text="{Binding Name}"/>
            </DockPanel>
       </StackPanel>
   </Window> 

代码后面

    public MainWindow()
    {
        InitializeComponent();
        //// Now every item in your `Window` hierarchy above autotmatically gets 
        //// the data context as the instance of EmployeeViewModel class.
        this.DataContext = new EmployeeViewModel(); 
    }  

下面是视图模型和模型的伪对象层次结构。

  EmployeeViewModel Class
    -> Property List<MenuItem> MenuItems
    -> Property List<Employee> Employees
    -> Property Employee SelectedEmployee
  Employee Class
    -> Property String Name 

为什么不能在xaml中设置数据上下文?

<DataGrid Name="grid_selectedEmployee" DataContext="{Binding EmployeeViewModel.SelectedEmployee}">
<DataGrid Name="datagrid_worksessions" ItemSource="{Binding SelectedWorkSessions}" >

只要确保SelectedEployee是DependancyProperty或EmployeeViewModel实现INotifyProperty更改