如何将 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>
我想从两个用户控件构建一个 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>