具有多种类型子节点的 WPF 树视图
WPF treeview with multiple types of child nodes
我有一个绑定到可观察集合的 TreeView,其中有两个可观察集合:
Public Class ocSpecialPolicies
Implements INotifyPropertyChanged
Public Event PropertyChanged(sender As Object, e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
Protected Overridable Sub OnPropertyChanged(ByVal Propertyname As String)
If Not Propertyname.Contains("Changed") Then
Changed = True
End If
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(Propertyname))
End Sub
Private _changed As Boolean
Public Property Changed() As Boolean
Get
Return _changed
End Get
Set(ByVal value As Boolean)
If _changed <> value Then
_changed = value
OnPropertyChanged("Changed")
End If
End Set
End Property
Public Property Items As New ObservableCollection(Of ocSpecialPoliciesItem)
Public Property Explanations As New ObservableCollection(Of ocSpecialPoliciesExplain)
Private _RecallNum As String
Public Property RecallNum As String
Get
Return _RecallNum
End Get
Set(value As String)
If _RecallNum <> value Then
_RecallNum = value
OnPropertyChanged("RecallNum")
End If
End Set
End Property
End Class
我已经完成一半了:
<TreeView Name="TreeView2" Margin="3" ItemsSource="{Binding ElementName=MainWindow, Path=SpecialPolicies, UpdateSourceTrigger=PropertyChanged}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Path=Items, UpdateSourceTrigger=PropertyChanged}">
<TextBlock Text="{Binding Path=RecallNum}" >
</TextBlock>
<HierarchicalDataTemplate.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=LaborOp}" >
</TextBlock>
</DataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
我可以在其中看到 RecallNum 属性 和项目 属性,但我无法弄清楚如何将 Explanations 也显示为 RecallNum 下的附加子节点。
理想情况下,它看起来像这样:
RecallNum*
Items
LaborOp
LaborOp
LaborOp**
Explanations
*ExplanationText
**ExplanationText
我试过 HierarchicalDataTemplate in TreeView.Resources,但我只是做错了什么。绑定是我一直难以理解的事情。
我不知道这是否适用于上下文,我现在不能尝试,但是...
<HierarchicalDataTemplate.ItemTemplate>
<DataTemplate TargetType="{x:Type=ocSpecialPoliciesItem}">
...
</DataTemplate>
<DataTemplate TargetType="{x:Type=ocSpecialPoliciesExplain}">
...
</DataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
或者类似的东西?
编辑:
理解我们想要一个具有两种项目的 TreeView
(抱歉,这是 C#,但我相信你可以翻译)。
您可以尝试创建一个基础 class,从中您可以派生 ocSpecialPoliciesItem 和 ocSpecialPoliciesExplain,并创建基础 class 的可观察集合。然后在你的 TreeView
.
中使用两个 DataTemplates
class SpecialPoliciesBase {}
class ocSpecialPoliciesItem : SpecialPoliciesBase
{ ... }
class ocSpecialPoliciesExplain : SpecialPoliciesBase
{ ... }
class ocSpecialPolicies
{
// this is where you put ocSpecialPoliciesItem and
// ocSpecialPoliciesExplain
// I do not see any code for populating your two collections,
// but I suppose you must have some somewhere
public ObersvableCollection<SpecialPoliciesBase> SPCollection
{ get ... }
}
在你的XAML
<TreeView
Name="TreeView2"
Margin="3"
ItemsSource="{
Binding ElementName=MainWindow,
Path=SPCollection,
UpdateSourceTrigger=PropertyChanged}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ...>
<TextBlock Text="{Binding Path=RecallNum}" />
<HierarchicalDataTemplate.ItemTemplate>
<DataTemplate TargetType={x:Type ocSpecialPoliciesItem} >
<!- this is where you put the template for Item !->
</DataTemplate>
<DataTemplate TargetType={x:Type: ocSpecialPoliciesExplain} >
<!- this is where you put the template for Explanations !->
</DataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
我有类似的东西可以工作,但不能用于树视图。我使用一个空的抽象 ViewBase class,带有几个具体的 View classes。我的 ViewModel 有一个名为 CurrentView 的 属性,类型为 ViewBase,每个具体视图都有一个 DataTemplate
。我的 XAML 为派生的 class CurrentView 选择了正确的 DataTemplate
。
我有一个绑定到可观察集合的 TreeView,其中有两个可观察集合:
Public Class ocSpecialPolicies
Implements INotifyPropertyChanged
Public Event PropertyChanged(sender As Object, e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
Protected Overridable Sub OnPropertyChanged(ByVal Propertyname As String)
If Not Propertyname.Contains("Changed") Then
Changed = True
End If
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(Propertyname))
End Sub
Private _changed As Boolean
Public Property Changed() As Boolean
Get
Return _changed
End Get
Set(ByVal value As Boolean)
If _changed <> value Then
_changed = value
OnPropertyChanged("Changed")
End If
End Set
End Property
Public Property Items As New ObservableCollection(Of ocSpecialPoliciesItem)
Public Property Explanations As New ObservableCollection(Of ocSpecialPoliciesExplain)
Private _RecallNum As String
Public Property RecallNum As String
Get
Return _RecallNum
End Get
Set(value As String)
If _RecallNum <> value Then
_RecallNum = value
OnPropertyChanged("RecallNum")
End If
End Set
End Property
End Class
我已经完成一半了:
<TreeView Name="TreeView2" Margin="3" ItemsSource="{Binding ElementName=MainWindow, Path=SpecialPolicies, UpdateSourceTrigger=PropertyChanged}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Path=Items, UpdateSourceTrigger=PropertyChanged}">
<TextBlock Text="{Binding Path=RecallNum}" >
</TextBlock>
<HierarchicalDataTemplate.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=LaborOp}" >
</TextBlock>
</DataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
我可以在其中看到 RecallNum 属性 和项目 属性,但我无法弄清楚如何将 Explanations 也显示为 RecallNum 下的附加子节点。
理想情况下,它看起来像这样:
RecallNum*
Items
LaborOp
LaborOp
LaborOp**
Explanations
*ExplanationText
**ExplanationText
我试过 HierarchicalDataTemplate in TreeView.Resources,但我只是做错了什么。绑定是我一直难以理解的事情。
我不知道这是否适用于上下文,我现在不能尝试,但是...
<HierarchicalDataTemplate.ItemTemplate>
<DataTemplate TargetType="{x:Type=ocSpecialPoliciesItem}">
...
</DataTemplate>
<DataTemplate TargetType="{x:Type=ocSpecialPoliciesExplain}">
...
</DataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
或者类似的东西?
编辑:
理解我们想要一个具有两种项目的 TreeView
(抱歉,这是 C#,但我相信你可以翻译)。
您可以尝试创建一个基础 class,从中您可以派生 ocSpecialPoliciesItem 和 ocSpecialPoliciesExplain,并创建基础 class 的可观察集合。然后在你的 TreeView
.
DataTemplates
class SpecialPoliciesBase {}
class ocSpecialPoliciesItem : SpecialPoliciesBase
{ ... }
class ocSpecialPoliciesExplain : SpecialPoliciesBase
{ ... }
class ocSpecialPolicies
{
// this is where you put ocSpecialPoliciesItem and
// ocSpecialPoliciesExplain
// I do not see any code for populating your two collections,
// but I suppose you must have some somewhere
public ObersvableCollection<SpecialPoliciesBase> SPCollection
{ get ... }
}
在你的XAML
<TreeView
Name="TreeView2"
Margin="3"
ItemsSource="{
Binding ElementName=MainWindow,
Path=SPCollection,
UpdateSourceTrigger=PropertyChanged}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ...>
<TextBlock Text="{Binding Path=RecallNum}" />
<HierarchicalDataTemplate.ItemTemplate>
<DataTemplate TargetType={x:Type ocSpecialPoliciesItem} >
<!- this is where you put the template for Item !->
</DataTemplate>
<DataTemplate TargetType={x:Type: ocSpecialPoliciesExplain} >
<!- this is where you put the template for Explanations !->
</DataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
我有类似的东西可以工作,但不能用于树视图。我使用一个空的抽象 ViewBase class,带有几个具体的 View classes。我的 ViewModel 有一个名为 CurrentView 的 属性,类型为 ViewBase,每个具体视图都有一个 DataTemplate
。我的 XAML 为派生的 class CurrentView 选择了正确的 DataTemplate
。