2012-01-02 1 views
2

У меня есть два DataGrids. EmployeeGrid и WorkSessionsGrid. У каждого сотрудника есть список WorkSessions, к которому я хочу получить доступ, выбрав пункт в EmployeeGrid, который должен заставить WorkSessionsGrid генерировать WorkSessions для выбранного Сотрудника. Почему следующее неверно?Связывание datagrid с выбранным элементом другого datagrid

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

Update Я пришел к выводу, что проблема должна быть в одном из других слоев. Вот оставшаяся часть моего кода, надеюсь, кто-то способен помочь мне. Есть ли что-то принципиально, что мне не хватает?

Code-Behind 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() 
    { 
    } 
+0

Неправильно вы подразумеваете, что это не работает? –

+0

Да, это не работает. Я думаю, что моя ошибка заключается в моем EmployeeViewModel. Правильно ли это, что моя Viewmodel имеет public ObservableCollection WorkSessions {get; задавать; }? – CodePrimate

+0

@litemode: извините за очень поздний ответ. Я столкнулся с похожим вопросом .. Неужели вы все-таки решили эту проблему? любезно ответ. – user1221765

ответ

0

Попробуйте Binding к Элементу вместо.

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

Этот бит XAML выглядит вполне корректно, попробуйте debug the binding, там могут быть некоторые другие проблемы, такие как визуальные разрывы деревьев или сбора WorkSessions Авось является полем, а не собственность и т.д.

Если есть связывая ошибки, пожалуйста, поделитесь ими.

+0

Должен ли WorkSessions быть общедоступным ObservableCollection в слое модели? – CodePrimate

+0

@litemode: он должен быть общедоступным [свойством] (http://msdn.microsoft.com/en-us/library/x9fsa0sw.aspx) на любом слое, к которому вы привязываетесь (т. Е. На любом элементе 'SelectedItem'). Вы еще что-то отлаживали, какие обязательные ошибки вы получаете? –

+0

Я сдался, пытаясь отладить его. На этом этапе я просто не могу наклонить голову вокруг совершенно новой концепции, такой как отладка привязки. – CodePrimate

0

As @ H.B. правильно указал, пожалуйста, используйте окно вывода Visual Studio для просмотра любых ошибок привязки. Они скажут вам, не связаны ли привязки. Если вы найдете привязные эррос, то ваша привязка должна быть решена по двум возможным вопросам ...

  1. Источник данных неверен. Правильно ли задан источник данных и источник элементов для этого элемента пользовательского интерфейса, например DataGrid?
  2. Неправильный путь к объекту в привязке. Является ли ваш SelectedItem объектом, имеющим объект с именем WorkSessions? и т.д.

Помимо этого мы еще не знаем, что dg_1 и dg_2 из вашего XAML есть. Ваш код позади показывает разные имена datagrid_employees и datagrid_worksessions Я думаю.

0

Вы должны добавить еще один элемент для EmployeeViewModel, вызванный: SelectedEmployee и связанный с выбранным элементом сетки сотрудника, mode = TwoWay.

Тогда вы для привязки второй сетки должна быть:

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

Поскольку оба сетей находятся в одном окне, таким образом, вы должны только установить DataContext только для окон. На стороне viewmodel у вас есть 2 свойства зависимостей: EmployeeList, SelectedEmployee. Принимая во внимание, что EmployeeList привязан к ItemsSource сетки сотрудников. SelectedEmployee привязан к SelectedItem в сетке служащих.

Смежные вопросы