2017-02-06 2 views
0

Я пытаюсь поместить элемент ItemsControl внутри ListBox, но у меня проблемы с привязкой данных для внутреннего элемента ItemsControl.WPF EF привязка данных: ItemsControl внутри ListBox (основная деталь)

EF Модель:

EF Database Model

EmployeeViewModel:

общественного класса EmployeeViewModel { общественного ListCollectionView Сотрудники {получить; задавать; }

public EmployeeViewModel() 
{ 
    LoadData(); 
} 

private void LoadData() 
{ 
    using (testdbEntities context = new testdbEntities()) 
    { 
     IEnumerable<Employees> query = (from e in context.Employees 
             orderby e.Lastname 
             select e); 

     ObservableCollection<Employees> emp = new ObservableCollection<Employees>(query); 
     Employees = new ListCollectionView(emp); 
    } 
} 

}

Вид:

<Window x:Class="Employee.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:Employee" 
     xmlns:viewModel="clr-namespace:Employee.ViewModel" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525"> 

    <Window.DataContext> 
     <viewModel:EmployeeViewModel/> 
    </Window.DataContext> 

    <Grid> 
     <ListBox x:Name="listEmployees" 
       ItemsSource="{Binding Employees}"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <StackPanel> 
         <TextBlock> 
          <Run Text="{Binding Lastname}"/>, 
          <Run Text="{Binding Firstname}"/> 
         </TextBlock> 
         <ItemsControl Name="empSkills" ItemsSource="{Binding Skills}"> 
          <ItemsControl.ItemTemplate> 
           <DataTemplate> 
            <TextBlock Text="{Binding Skill}"/> 
           </DataTemplate> 
          </ItemsControl.ItemTemplate> 
         </ItemsControl> 
        </StackPanel> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 
    </Grid> 
</Window> 

ListBox связывает отлично, но внутренний ItemsControl нет.

В чем может быть проблема? Любая помощь приветствуется.

Выход: System.Windows.Data Ошибка: 17: Не удается получить значение 'навыки' (типа 'ICollection`1') из '' (типа 'Employees_463D630561C8612AEA43DCC3EC6E2ACDC644CFB28D50978184F80EEEE86D779E'). BindingExpression: Path = Навыки; DataItem = 'Employees_463D630561C8612AEA43DCC3EC6E2ACDC644CFB28D50978184F80EEEE86D779E' (HashCode = 29719745); целевой элемент - «ItemsControl» (Name = ''); предназначаться свойство является 'ItemsSource' (тип 'IEnumerable') TargetInvocationException: 'System.Reflection.TargetInvocationException: Der Eigenschaftenaccessor Навыки für дас System.Data.Entity.DynamicProxies.Employees_463D630561C8612AEA43DCC3EC6E2ACDC644CFB28D50978184F80EEEE86D779E-Objekt шляпа folgende Ausnahme verursacht: Die ObjectContext-Instanz Würde verworfen унд канн nicht mehr für Vorgänge verwendet werden, für die eine Verbindung erforderlich ist. ---> System.ObjectDisposedException: Die ObjectContext-Instanz wurde verworfen und kann nicht mehr für Vorgänge verwendet werden, für die eine Verbindung erforderlich ist.

+0

Давайте посмотрим информацию из вашего Output Window. Это должно быть кричать, если есть ошибки привязки. Пожалуйста, отредактируйте свой вопрос и включите его. –

ответ

0

Несомненно, свойства Firstname и Lastname - это внутренняя модель просмотра, а не модель основного вида сотрудников? Вам не нужно менять datacontext на внутреннюю/детальную модель?

+0

ItemsControl по сути устанавливает новый DataContext для дочерних элементов. –

0

Чтение вывода привело меня к решению. Спасибо Линну за подсказку.

Проблема заключается в использовании блока использования в LoadData(). Данные сотрудника могут быть загружены, но предотвращают ленивую загрузку данных навыков во внутреннем ItemsControl.

Новая рабочая версия моего EmployeeViewModel

public class EmployeeViewModel 
    { 
     private testdbEntities context = new testdbEntities(); 

     public ListCollectionView Employees { get; set; } 

     public EmployeeViewModel() 
     { 
      LoadData(); 
     } 

     private void LoadData() 
     { 
      IEnumerable<Employees> query = (from e in context.Employees 
              orderby e.Lastname 
              select e); 

      ObservableCollection<Employees> emp = new ObservableCollection<Employees>(query); 
      Employees = new ListCollectionView(emp); 
     } 

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