2017-02-06 3 views
0

Ich versuche, ein ItemsControl innerhalb einer ListBox zu platzieren, aber ich habe Probleme mit der Datenbindung für die innere ItemsControl.WPF EF Datenbindung: ItemsControl in ListBox (Hauptdetail)

EF Modell:

EF Database Model

EmployeeViewModel:

public class EmployeeViewModel { public Listcollectionview Mitarbeiter {get; einstellen; }

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

}

Ausblick:

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

Die List-Box bindet perfekt, aber die innere Items nicht.

Was könnte das Problem sein? Jede Hilfe wird geschätzt.

Ausgang: System.Windows.Data Fehler: 17: Kann nicht bekommen 'Skills' Wert (Typ 'ICollection`1') von '' (Typ 'Employees_463D630561C8612AEA43DCC3EC6E2ACDC644CFB28D50978184F80EEEE86D779E'). BindingExpression: Pfad = Skills; DataItem = 'Employees_463D630561C8612AEA43DCC3EC6E2ACDC644CFB28D50978184F80EEEE86D779E' (HashCode = 29719745); Zielelement ist 'ItemsControl' (Name = ''); Zieleigenschaft ist 'ItemsSource' (Typ 'IEnumerable') TargetInvocationException: 'System.Reflection.TargetInvocationException: Der Eigenschaftenaccessor Skills für das System.Data.Entity.DynamicProxies.Employees_463D630561C8612AEA43DCC3EC6E2ACDC644CFB28D50978184F80EEEE86D779E-Objekt hat folgende Ausnahme: Die ObjectContext-Instanz wurde verarbeitet und kann nicht mehr für den Fall, dass eine Verbindung notwendig ist. ---> System.ObjectDisposedException: Die ObjectContext-Instanz wurde ausgeführt und kann nicht mehr für einen bestimmten Zweck konfiguriert werden.

+0

die Informationen von Ihrem Ausgabefenster sehen lassen. Das sollte schreien, wenn es verbindliche Fehler gibt. Bitte [Bearbeiten] Sie Ihre Frage und fügen Sie das ein. –

Antwort

0

Sicherlich Eigenschaften von Firstname und Nachname sind in inneren Ansicht Modell und nicht das Hauptansichtsmodell von Mitarbeitern? Müssen Sie den Datenkontext nicht in das innere/Detailansichtsmodell ändern?

+0

ItemsControl legt einen neuen DataContext für untergeordnete Elemente fest. –

0

Lesen der Ausgabe führte mich zur Lösung. Danke Lynn für den Hinweis.

Das Problem ist die Verwendung des using-Blocks in LoadData(). Mitarbeiterdaten können geladen werden, verhindern jedoch das verzögerte Laden von Fertigkeitsdaten im inneren ItemsControl.

Neue Arbeits Version meiner 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); 
     } 

    } 
}