2016-09-23 10 views
2

MVVM에서 2 레벨 구조화 된 데이터를 나타내야합니다. 데이터가 될 경우직접 링크가없는 2 레벨 구조화 된 데이터의 WPF 바인딩

<TreeView x:Name="treeView"> 
    <TreeView.Resources> 

     <!--Template for ParentEntity--> 
     <HierarchicalDataTemplate DataType="{x:Type ParentEntity}" ItemsSource="{Binding ChildsEntities}"> 
      <TextBox Text="{Binding Name}"/> 
     </HierarchicalDataTemplate> 

     <!--Template for ChildEntity--> 
     <DataTemplate DataType="{x:Type ChildEntity}"> 
      <StackPanel Orientation="Horizontal"> 
       <TextBox Text="{Binding Name}"/> 
       <TextBox Text="{Binding Value}"/> 
      </StackPanel> 
     </DataTemplate> 

    </TreeView.Resources> 
</TreeView> 

ObservableCollection<ParentEntity> data = new ObservableCollection<ParentEntity>(); 
treeView.ItemsSource = data ; 

하지만 (라이브러리)과 같은 구조를 가지고 : 다음

public class ParentEntity 
{ 
    public ObservableCollection<ChildEntity> ChildsEntities { get; set; } = new ObservableCollection<ChildEntity>(); 
    public string Name { get; set; } 
} 

public class ChildEntity 
{ 
    public string Name { get; set; } 
    public int Value { get; set; } 
} 

나는 트 리뷰와 결합하여 만든 것입니다

public class ParentEntity 
{ 
    public int UID { get; set; } 
    public string Name { get; set; } 
} 

public class ChildEntity 
{ 
    public int ParentUID { get; set; } 
    public string Name { get; set; } 
    public int Value { get; set; } 
} 

그것을 어떻게해야 처리 되었습니까? 감사.

+0

질문의 첫 번째 부분에서 설명하는 구조를 제공하는 객체에서 엔티티를 래핑하는 것이 고려 되었습니까? – vkluge

+0

예, 처음 생각 이었지만 올바른 접근 방법인지 확신 할 수 없습니다. – Feofilakt

+0

IValueConverter를 사용하여 부모에게 해당 자식 개체를 반환하는 메서드를 호출 할 수 있습니다. [here] (http://stackoverflow.com/a/844946/4189791) 참조. 그러나이 개체는 definitly "right" 접근. – vkluge

답변

0

나는 정말 추천하고 있지 않다,하지만 난 당신이 XAML

<StackPanel x:Name="root"> 
     <StackPanel.DataContext> 
      <vm:MainWindowViewModel></vm:MainWindowViewModel> 
     </StackPanel.DataContext> 
     <Button Command="{Binding AddRoot}">Add</Button> 
     <TreeView Height="400"> 
      <TreeView.Resources > 
       <Style TargetType="{x:Type TreeViewItem}"> 
        <Setter Property="IsExpanded" Value="True"> 
        </Setter> 
       </Style> 
       <vm:HierarchicalDataConverter x:Key="HierarchicalDataConverter"/> 
       <HierarchicalDataTemplate x:Key="ParentEntityTemplate" DataType="{x:Type vm:ParentEntity}" > 
        <HierarchicalDataTemplate.ItemsSource> 
         <MultiBinding Converter="{StaticResource HierarchicalDataConverter}" Mode="TwoWay"> 
          <Binding Mode="OneTime"></Binding> 
          <Binding Path="DataContext.Items" ElementName="root" ></Binding> 
          <Binding Path="DataContext.Items.Count" ElementName="root" ></Binding> 
         </MultiBinding> 
        </HierarchicalDataTemplate.ItemsSource> 
        <StackPanel Orientation="Horizontal"> 
         <TextBlock Text="{ Binding Name }"></TextBlock> 
         <Button Command="{Binding DataContext.AddLeafe, ElementName=root}" CommandParameter="{Binding}">Add item</Button> 
        </StackPanel> 
       </HierarchicalDataTemplate> 
       <DataTemplate x:Key="ChildEntityTemplate" DataType="{x:Type vm:ChildEntity}"> 
        <TextBlock Text="{Binding Name}"></TextBlock> 
       </DataTemplate> 
      </TreeView.Resources> 
      <TreeView.ItemsSource> 
       <Binding Path="RootItems"/> 
      </TreeView.ItemsSource> 
      <TreeView.ItemTemplateSelector> 
       <vm:ItemTemplateSelector> 
       </vm:ItemTemplateSelector> 
      </TreeView.ItemTemplateSelector> 
     </TreeView> 
    </StackPanel> 

VM 네임 스페이스

public class MainWindowViewModel : BindableBase 
    { 
     public ObservableCollection<object> Items { get; } = 
      new ObservableCollection<object>(new List<object>(new List<object> 
     { 
      new ParentEntity { UID = 1, Name = "Groop1" }, 
      new ChildEntity { ParentUID = 1, Name = "Item1" }, 
      new ParentEntity { UID = 2, Name = "Groop2" }, 
      new ChildEntity { ParentUID = 2, Name = "Item1" }, 
      new ChildEntity { ParentUID = 2, Name = "Item2" }, 
      new ChildEntity { ParentUID = 2, Name = "Item3" } 
     })); 

     public CollectionView RootItems { get; } 


     int count = 2; 
     public DelegateCommand AddRoot { get; } 

     public DelegateCommand<ParentEntity> AddLeafe { get; } 
     public MainWindowViewModel() 
     { 
      RootItems = new ListCollectionView(Items) { Filter = (item) => item is ParentEntity }; 

      AddRoot = new DelegateCommand(() => 
      { 
       Items.Add(new ParentEntity { UID = ++count ,Name= "Group"+count}); 
      }); 

      AddLeafe = new DelegateCommand<ParentEntity>((pe) => 
      { 
       Items.Add(new ChildEntity { ParentUID = pe.UID, Name = "Item" + count }); 
      }); 

     } 

    } 

    public class ParentEntity 
    { 
     public int UID { get; set; } 
     public string Name { get; set; } 
    } 

    public class ChildEntity 
    { 
     public int ParentUID { get; set; } 
     public string Name { get; set; } 
     public int Value { get; set; } 
    } 

    public class ItemTemplateSelector : DataTemplateSelector 
    { 
     public override DataTemplate 
      SelectTemplate(object item, DependencyObject container) 
     { 
      FrameworkElement element = container as FrameworkElement; 

      if (item is ParentEntity) 
      { 
       return element.FindResource("ParentEntityTemplate") as DataTemplate; 
      } 
      if (item is ChildEntity) 
      { 
       return element.FindResource("ChildEntityTemplate") as DataTemplate; 
      } 
      return null; 
     } 
    } 

    public class HierarchicalDataConverter : IMultiValueConverter 
    { 
     public object Convert(object[] value, Type targetType, object parameter, CultureInfo culture) 
     { 
      if (value[0] != null) 
      { 
       ParentEntity pe = value[0] as ParentEntity; 
       var items = value[1] as IEnumerable<object>; 

       return items.Where((item) => item is ChildEntity && (item as ChildEntity).ParentUID == pe.UID); 
      } 
      return null; 
     } 

     public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 
    } 

에게이 문제를 해결할 수이의 문제는 모든 자식 노드를 다시 것입니다