나는 정말 추천하고 있지 않다,하지만 난 당신이 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();
}
}
에게이 문제를 해결할 수이의 문제는 모든 자식 노드를 다시 것입니다
질문의 첫 번째 부분에서 설명하는 구조를 제공하는 객체에서 엔티티를 래핑하는 것이 고려 되었습니까? – vkluge
예, 처음 생각 이었지만 올바른 접근 방법인지 확신 할 수 없습니다. – Feofilakt
IValueConverter를 사용하여 부모에게 해당 자식 개체를 반환하는 메서드를 호출 할 수 있습니다. [here] (http://stackoverflow.com/a/844946/4189791) 참조. 그러나이 개체는 definitly "right" 접근. – vkluge