2017-02-06 13 views
0

ListBox内にItemsControlを配置しようとしていますが、内部ItemsControlのデータバインディングに問題があります。WPF EFデータバインディング:ListBox内のItemsControl(マスター詳細)

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> 

リストボックスは完全に結合するが、内部のItemsControlません。

何が問題なのですか? 助けていただければ幸いです。

出力: System.Windows.Dataエラー:17: ''(タイプ 'Employees_463D630561C8612AEA43DCC3EC6E2ACDC644CFB28D50978184F80EEEE86D779E')から(タイプ 'ICollection`1') 'スキル' の値を取得できません。 BindingExpression:Path =スキル; DataItem = 'Employees_463D630561C8612AEA43DCC3EC6E2ACDC644CFB28D50978184F80EEEE86D779E'(HashCode = 29719745);ターゲット要素は 'ItemsControl'(Name = '')です。ターゲットプロパティが 'のItemsSource'(タイプ 'IEnumerableを')に、TargetInvocationExceptionです:「System.Reflection.TargetInvocationException:デアEigenschaftenaccessorスキルエリーゼDAS System.Data.Entity.DynamicProxies.Employees_463D630561C8612AEA43DCC3EC6E2ACDC644CFB28D50978184F80EEEE86D779E-Objektハットfolgende Ausnahmeのverursacht:ダイのObjectContext-Instanz wurde verworfenウントカンあなたのために、あなたのために、あなたのために、あなたのために祈りなさい。 ---> System.ObjectDisposedException:ObjectContext-Instanzは、エラーが発生した場合は、エラーが発生した場合に表示されます。

+0

はのは、あなたの出力ウィンドウからの情報を見てみましょう。綴り間違いがあると、それは悲鳴を上げるはずです。あなたの質問を[編集]してください。 –

答えて

0

FirstnameとLastnameのプロパティは、内部ビューモデルであり、Employeesのメインビューモデルではありませんか?内部/詳細ビューモデルにデータコンテキストを変更する必要はありませんか?

+0

ItemsControlは、子アイテムの新しいDataContextを本来設定します。 –

0

出力を読み取ることで、私はソリューションにつながりました。ヒントのためにリンに感謝します。

問題はLoadData()でusingブロックを使用することです。従業員のデータを読み込むことはできますが、内側の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); 
     } 

    } 
} 
関連する問題