如何将 ObservableCollections 绑定到 TreeView 并显示相应的视图?

How to bind ObservableCollections to a TreeView and display the corresponding views?

我想从两个用户控件构建一个 TreeView,它们将按层次结构构建(header 下的项目)。这应该通过绑定两个嵌套的 ObservableCollection 来完成。由于所有控件都已在从属视图本身中定义,因此不应在上级视图中定义它们。

据我了解,设置树视图的项目源然后定义HierarchicalDataTemplate和“底层”DataTemplate.

应该就足够了

但是,不幸的是,view 和 viewmodel 的分配不适用于以下设置:

App.xaml:

<DataTemplate DataType="{x:Type Models:EvaluationHeaderViewModel}">
    <Views:EvaluationHeaderView/>
</DataTemplate>
<DataTemplate DataType="{x:Type Models:EvaluationItemViewModel}">
    <Views:EvaluationItemView/>
</DataTemplate>

树视图:

<TreeView 
    MaxHeight="500"
    Name="EvaluationTreeView"
    ScrollViewer.CanContentScroll="True" 
    ScrollViewer.VerticalScrollBarVisibility="Auto" 
    ScrollViewer.HorizontalScrollBarVisibility="Hidden" 
    Grid.Row="4" 
    Grid.Column="1"
    ItemsSource="{Binding EvaluationHeaderViewModels, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True, NotifyOnTargetUpdated=True}"
    >
    <TreeView.Resources>
        <HierarchicalDataTemplate DataType="{x:Type Models:EvaluationHeaderViewModel}" ItemsSource="{Binding EvaluationItemViewModels}"/>
        <DataTemplate DataType="{x:Type Models:EvaluationItemViewModel}"/>
    </TreeView.Resources>
</TreeView>

名单:

private ObservableCollection<EvaluationHeaderViewModel> evaluationHeaderViewModels;
public ObservableCollection<EvaluationHeaderViewModel> EvaluationHeaderViewModels {
    get => evaluationHeaderViewModels;
    set
    {
        evaluationHeaderViewModels = value;
        OnPropertyChanged();
    }
}

public ObservableCollection<EvaluationItemViewModel> EvaluationItemViewModels { get; set; }

public EvaluationHeaderViewModel()
{
    EvaluationItemViewModels = new ObservableCollection<EvaluationItemViewModel>();
    EvaluationItemViewModels.Add(new EvaluationItemViewModel());
}

如何将 ObservableCollections 绑定到 TreeView 以便显示 UserControls?

您似乎定义了两次模板。删除 <TreeView.Resources> 元素或定义要在那里使用的实际模板,而不是在 App.xaml:

中使用
<TreeView ItemsSource="{Binding EvaluationHeaderViewModels}">
    <TreeView.Resources>
        <HierarchicalDataTemplate DataType="{x:Type Models:EvaluationHeaderViewModel}"
                                  ItemsSource="{Binding EvaluationItemViewModels}">
            <Views:EvaluationHeaderView/>
        </HierarchicalDataTemplate>
        <DataTemplate DataType="{x:Type Models:EvaluationItemViewModel}">
            <Views:EvaluationItemView/>
        </DataTemplate>
    </TreeView.Resources>
</TreeView>