이 같은 시도 할 수 있습니다 :의 TypeCategory Name
이 Category
에서 을 포함 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 ItemSource
에 MultiBinding
를 적용해야합니다.
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();
}
}
이 내가 여분의 목록을 생성하지 않고, 또한 일을 생각되었지만, 그냥 multibinding 또는 다른 솔루션을 사용하여 해결할 수있을 것인지 궁금 무엇인가? 이는 바인딩 및 XAML의 제한 사항에 대한 지식이 부족하기 때문입니다. –
@dennis_ler 업데이트 된 답변 확인 ... –
감사합니다. –