如何根据数据网格的选定项设置多个元素的数据上下文?
本文关键字:数据 设置 元素 上下文 何根 数据网 网格 | 更新日期: 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_worksession
和grid_selectedEmployee
(假设它们不是任何ItemsControl
的一部分)自动获取它。
一旦获得了数据上下文,接下来的问题就是使用Binding
和Path
从数据上下文映射到相关的对象。
下面的例子会告诉你…(仅作说明之用)
<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更改