2015-01-16 5 views
0

입니다. ViewModel에 두 개의 ObservableCollection이있는 문제가 있습니다.두 개의 개별 목록에서 트리 뷰를 생성합니다. 하위 개체의 부모 개체는 ID가

public class TypeCategory { 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
} 

다른 목록은 다음과 같습니다 : 하나 개의 목록은 다음과 같은 개체를 포함

public class TheViewModel { 
    public ObservableCollection<TypeCategory > TypeCategories { get; private set; } 
    public ObservableCollection<Type> Types { get; private set; } 
} 

TypeTypeCategory 연결에 childNode에 있습니다 :

public class Type { 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public int CategoryId { get; set; } 
} 

뷰 모델과 같은 것입니다 부모 노드로의 연결은 CategoryId입니다. 예를 들어 멀티 바인딩 및 변환기를 사용하여 두 목록을 연결하여 TreeView를 생성 할 수 있습니까? 부모 클래스를 확장하여 자녀를 포함시킬 수있는 유일한 솔루션입니까?

답변

1

이 같은 시도 할 수 있습니다 :의 TypeCategory NameCategory에서 을 포함 Key & List<string>로 개최

사용 Dictionary<string,List<string>>을.

public class TheViewModel 
{ 
    public ObservableCollection<TypeCategory> TypeCategories { get; set; } 
    public ObservableCollection<Type> Types { get; set; } 
    public Dictionary<string,List<string>> TreeViewItemSource { get; set; } 

    public TheViewModel() 
    { 
     TypeCategories = new ObservableCollection<TypeCategory>(); 
     Types = new ObservableCollection<Type>(); 
     TreeViewItemSource = new Dictionary<string, List<string>>(); 

     for (int i = 0; i < 10; i++) 
     { 
      TypeCategories.Add(new TypeCategory() { Id = i, Name = "TypeCategory "+ i, Description = string.Empty }); 
     } 

     for (int i = 0; i < 50; i++) 
     { 
      Types.Add(new Type() { CategoryId = i/5, Name = "Type " + i, Description = string.Empty }); 
     } 

     foreach (TypeCategory item in TypeCategories) 
     { 
      List<string> list = Types.Where(p => p.CategoryId == item.Id).Select(p=>p.Name).ToList<string>(); 
      TreeViewItemSource.Add(item.Name, list); 
     } 
    } 
} 

XAML

이 당신을 도울 것입니다

<TreeView Name="treeView1" ItemsSource="{Binding TreeViewItemSource}" > 
    <TreeView.ItemTemplate> 
     <HierarchicalDataTemplate ItemsSource="{Binding Path=Value}"> 
      <TextBlock FontWeight="Bold" Text="{Binding Path=Key}" /> 
      <HierarchicalDataTemplate.ItemTemplate> 
       <DataTemplate> 
        <TextBlock Text="{Binding }"/> 
       </DataTemplate> 
      </HierarchicalDataTemplate.ItemTemplate> 
     </HierarchicalDataTemplate> 
    </TreeView.ItemTemplate> 
</TreeView> 

희망.

UPDATE

: 당신이 다음 사전을 만들지 않으려면

당신은 HierarchicalDataTemplate's ItemSourceMultiBinding를 적용해야합니다.

xmlns:local="clr-namespace:assembly_Name" 
..... 
<TreeView Name="treeView1" ItemsSource="{Binding TypeCategories}" Tag="{Binding Types}"> 
    <TreeView.Resources> 
     <local:CategoryItemsConverter x:Key="CategoryItemsConverter"/> 
    </TreeView.Resources> 
    <TreeView.ItemTemplate> 
     <HierarchicalDataTemplate > 
      <HierarchicalDataTemplate.ItemsSource> 
       <MultiBinding Converter="{StaticResource CategoryItemsConverter}"> 
        <Binding Path="Tag" ElementName="treeView1"/> 
        <Binding Path="ItemsSource" ElementName="treeView1"/> 
        <Binding Path="Name"/> 
       </MultiBinding> 
      </HierarchicalDataTemplate.ItemsSource> 
      <TextBlock FontWeight="Bold" Text="{Binding Name}" /> 
      <HierarchicalDataTemplate.ItemTemplate> 
       <DataTemplate> 
        <TextBlock Text="{Binding Name}"/> 
       </DataTemplate> 
      </HierarchicalDataTemplate.ItemTemplate> 
     </HierarchicalDataTemplate> 
    </TreeView.ItemTemplate> 
</TreeView> 

CategoryItemsConverter :

public class CategoryItemsConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, System.Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     ObservableCollection<Type> typesList = values[0] as ObservableCollection<Type>; 
     ObservableCollection<TypeCategory> categoryList = values[1] as ObservableCollection<TypeCategory>; 
     string currentCategory = values[2] as string; 
     if (typesList != null && categoryList != null && !string.IsNullOrEmpty(currentCategory)) 
     { 
      int? categoryId = categoryList.Where(p => p.Name == currentCategory).Select(p=>p.Id).FirstOrDefault(); 
      if (categoryId.HasValue) 
      { 
       var a = typesList.Where(p => p.CategoryId == categoryId).ToList<Type>(); 
       if (a.Any()) 
       { 
        return a; 
       } 
      } 
     } 
     return null; 
    } 

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

이 내가 여분의 목록을 생성하지 않고, 또한 일을 생각되었지만, 그냥 multibinding 또는 다른 솔루션을 사용하여 해결할 수있을 것인지 궁금 무엇인가? 이는 바인딩 및 XAML의 제한 사항에 대한 지식이 부족하기 때문입니다. –

+1

@dennis_ler 업데이트 된 답변 확인 ... –

+0

감사합니다. –