2016-09-07 5 views
0

私は、小さなプロジェクトでWPF MVVMの学習方法を学んでいます。私がこの障害を打ち砕くまでは、すべてが大丈夫でした。観察可能なコレクションにツリービューをバインドして、部署とその教師を示すようにしました。データは熱心に読み込まれ、遅延読み込みは行われません。ここTreeViewをEFエンティティのグラフにバインドする

は、私の見解モデルである:私ならば、これは動作しません。しかし

<UserControl x:Class="CV.Modules.Views.NavigationTreeView" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:vm="clr-namespace:CV.Modules.ViewModels" 
     xmlns:prism="http://prismlibrary.com/"    
     prism:ViewModelLocator.AutoWireViewModel="True"> 

<UserControl.DataContext> 
    <vm:NavigationTreeViewModel/> 
</UserControl.DataContext> 

<TreeView ItemsSource="{Binding Departments}" Margin="5"> 
    <TreeView.ItemTemplate> 
     <HierarchicalDataTemplate ItemsSource="{Binding Teachers}"> 
      <TextBlock Text="{Binding Name}"/> 
     </HierarchicalDataTemplate> 
    </TreeView.ItemTemplate> 
</TreeView> 

</UserControl> 

public class NavigationTreeViewModel : BindableBase 
{ 
    private CV.Model.Context.CVContext _dbContext; 

    public NavigationTreeViewModel() 
    { 
     _dbContext = new Model.Context.CVContext(); 
     LoadDepartments(); 
    } 

    private void LoadDepartments() 
    { 
     var result = _dbContext.Departments.Include(a => a.Teachers); 
     _departments = new ObservableCollection<Department>(result.ToList()); 
    } 

    private ObservableCollection<Teacher> _teachers; 
    public ObservableCollection<Teacher> Teachers 
    { 
     get { return _teachers; } 
     set { SetProperty(ref _teachers, value); } 
    } 

    private ObservableCollection<Department> _departments; 
    public ObservableCollection<Department> Departments 
    { 
     get { return _departments; } 
     set { SetProperty(ref _departments, value); } 
    } 

} 

私は、部門などのような教師の名前を表示するように設定を結合することができます親エンティティに部門名を表示し、子エンティティに教師の姓を表示します。ツリービューのテンプレートをこのarticleに基づくコントロールのリソースに変更しました。ここには私がしたことがあります:

<UserControl.Resources> 
    <DataTemplate x:Key="TeacherLevel"> 
     <TextBlock Text="{Binding LastName}"/> 
    </DataTemplate> 
    <HierarchicalDataTemplate x:Key="DepartmentLevel" 
           ItemsSource="{Binding Departments}" 
           ItemTemplate="{StaticResource TeacherLevel}"> 
     <TextBlock Text="{Binding Name}"/> 
    </HierarchicalDataTemplate> 
</UserControl.Resources> 

<TreeView ItemTemplate="{StaticResource DepartmentLevel}" 
      ItemsSource="{Binding Departments}" 
      Margin="5"/> 

この方法では、教師の姓は表示されますが、姓は表示されません。 エンティティのプロパティにアクセスしようとするときにIntellisenseが使用できないことに気付きました。唯一利用可能なのは、私のviewModelのプロパティです。私の最初の拘束力のある試みでは、私はすべての部署の特性を見ることができますが、私の2番目の拘束力のある試みではありません

私の質問これは、ツリービューを、各レベルで異なるプロパティを示す複数レベルのエンティティグラフにバインドするにはどうすればよいですか?

ここでは非常に基本的なものがありませんが、私はそれに私の指を置くことはできません。どんな助けでも大歓迎です。

ありがとうございます。

+0

Google検索* mvvm wpf treeview * - > http://www.codeproject.com/Articles/26288/Simplifying-the-WPF-TreeView-by-Using-the-ViewMode(最初の結果) –

答えて

0

ありがとうございます@Sir Rufo for the Links。

私のテンプレートには、私がバインドしているデータの種類がありませんでした。私がバインディングするプロパティを知るためには、HierarchicalDataTemplateのDataTypeが必要です。

両方の推奨解決策は、ViewModelのツリービューにバインドされるエンティティを定義します。

私のモデルは別のアセンブリで定義されていますので、私のビューでモデルを参照してしまいました。このようにして私の見解は私のモデルを知っています。私はこれをやってMVVMパターンを破っていると確信しています。私は自分のビューにデータバインディングを提供するためだけに、追加の同一クラスを作成するという考えは嫌いでした。私のコードは、今どのように見えるかここで

:それは私の質問に答えるためにどのように私を指摘しているため

<UserControl x:Class="CV.Modules.Views.NavigationTreeView" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:vm="clr-namespace:CV.Modules.ViewModels" 
     xmlns:data="clr-namespace:CV.Model;assembly=CV.Model" 
     xmlns:prism="http://prismlibrary.com/"    
     prism:ViewModelLocator.AutoWireViewModel="True"> 

<UserControl.Resources> 

    <HierarchicalDataTemplate ItemsSource="{Binding Teachers}" 
           DataType="{x:Type data:Department}"> 
     <TextBlock Text="{Binding Name}"/> 
    </HierarchicalDataTemplate> 

    <DataTemplate DataType="{x:Type data:Teacher}"> 
     <TextBlock Text="{Binding LastName}" /> 
    </DataTemplate> 
</UserControl.Resources> 

<TreeView ItemsSource="{Binding Departments}" Margin="5"/> 
</UserControl> 

は、私は答えとしてSOからのリンクをマークしています。 将来、モデルエンティティでビューを汚染しない解決策を見つけたら、この回答を編集します。 お気軽に

関連する問題