Как настроить текст данных нескольких элементов в зависимости от выбранного элемента сетки данных? - PullRequest
0 голосов
/ 03 января 2012

Еще раз прошу вас, stackoverflow, в мое нужное время.

Я пытаюсь привязать Панель инструментов, Меню и DataGrid (datagrid_worksessions) к выбранному элементу другой DataGrid (datagrid_employees). Сложность в том, что мне нужно, чтобы панель инструментов и меню связывались с элементами слоя ViewModel, а DataGrid связывался со слоем модели этого конкретного объекта.

Это код моего приложения ViewLayer. Дайте мне знать, если вам нужно больше.

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;
    }
}
}

Ответы [ 2 ]

1 голос
/ 03 января 2012

DataContext - это наследуемое свойство Dependency, которое означает, что если вы установите его для родительского графического интерфейса, то все дочерние элементы автоматически получат его.

Таким образом, в вашем случае, просто установив контекст данных окна \ пользовательского элемента управления, вы получите 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 
0 голосов
/ 03 января 2012

Почему нельзя установить текст данных в xaml?

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

<DataGrid Name="datagrid_worksessions" ItemSource="{Binding SelectedWorkSessions}" >

Просто убедитесь, что SelectedEployee является DependancyProperty или EmployeeViewModel реализует изменение INotifyProperty.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...