我已经实现了TreeView
,并使用绑定到视图模型中CollectionViewSource
的{{1}}填充了ObserableCollection
。
(以下代码)
有人可以帮助我理解如何将复选框IsChecked属性绑定到树视图第二级集合的ViewModel上的属性。
我正在尝试创建这样一种情况:如果检查子项,那么也检查父节点,反之亦然。
我认为主要的问题是我不知道如何操作项目,除非它们在叶子节点上,否则我无法访问父级别中的Items集合。
还有一种方法可以绑定CollectionViewSource的Source并使用thouse项绑定到?
赞赏任何提示或代码示例
CollectionViewSource
<CollectionViewSource x:Key="CSV"
Source="{Binding TestApplications}">
<CollectionViewSource.SortDescriptions>
<scm:SortDescription PropertyName="BaseAppName" />
<scm:SortDescription PropertyName="Category" />
<scm:SortDescription PropertyName="AppName" />
</CollectionViewSource.SortDescriptions>
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="BaseAppName" />
<PropertyGroupDescription PropertyName="Category" />
</CollectionViewSource.GroupDescriptions>
DataTemapltes
<DataTemplate x:Key="AppNameTemplate">
<StackPanel Orientation="Horizontal">
<CheckBox IsChecked="{Binding Path=IsChecked, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
IsEnabled="True"
IsThreeState="False"
Name="btnChecked">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Checked">
<i:InvokeCommandAction Command="{Binding RelativeSource= {RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path= DataContext.SelectedTestAppChangedCommand}"/>
</i:EventTrigger>
<i:EventTrigger EventName="Unchecked">
<i:InvokeCommandAction Command="{Binding RelativeSource= {RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path= DataContext.SelectedTestAppChangedCommand2}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</CheckBox>
<TextBlock Text="{Binding AppName}"
FontWeight="Bold">
</TextBlock>
</StackPanel>
</DataTemplate>
<HierarchicalDataTemplate x:Key="CategoryTemplate"
ItemsSource="{Binding Path=Items}"
ItemTemplate="{StaticResource AppNameTemplate}">
<StackPanel Orientation="Horizontal">
<CheckBox IsChecked="{Binding RelativeSource= {RelativeSource Mode=FindAncestor, AncestorType={x:Type TreeViewItem},AncestorLevel=2}, Path=IsChecked, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
IsEnabled="True"
IsThreeState="False"
Name="btnChecked">
</CheckBox>
<TextBlock Text="{Binding Name}"
FontStyle="Italic">
</TextBlock>
</StackPanel>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate x:Key="BaseAppTemplate"
ItemsSource="{Binding Path=Items}"
ItemTemplate="{StaticResource CategoryTemplate}">
<TextBlock Text="{Binding Name}" />
</HierarchicalDataTemplate>
的TreeView
treeview
具有以下来源和模板:
ItemsSource="{Binding Source={StaticResource CSV}, Path=Groups}"
ItemTemplate="{StaticResource BaseAppTemplate}"
更多详情
ReadOnly Property TestApplications As ObservableCollection(Of ToolBaseModel)
** BaseModel **
Public Class ToolBaseModel
Inherits NotificationObject
Public Property Key As String
Get
Return mstrKey
End Get
Set(value As String)
mstrKey = value
Me.RaisePropertyChanged(Function() Me.AppName)
End Set
End Property
Public Property Value As String
Get
Return mstrValue
End Get
Set(value As String)
mstrValue = value
Me.RaisePropertyChanged(Function() Me.Value)
End Set
End Property
Public Property BaseAppName As String
Get
Return mstrConfgiFileName
End Get
Set(value As String)
mstrConfgiFileName = value
Me.RaisePropertyChanged(Function() Me.BaseAppName)
End Set
End Property
Public Property Category As String
Get
Return mstrKey.Split(":"c).First
End Get
Set(value As String)
mstrCategory = value
Me.RaisePropertyChanged(Function() Me.Category)
End Set
End Property
Public Property IsChecked() As Boolean
Get
Return mblnIsChecked
End Get
Set(ByVal value As Boolean)
Me.RaisePropertyChanged(Function() Me.IsChecked)
End Set
End Property
Public Property AppName As String
Get
Return mstrKey.Split(":"c)(1)
End Get
Set(value As String)
mstrKey = value
Me.RaisePropertyChanged(Function() Me.AppName)
End Set
End Property
Public Property IsSelected() As Boolean
Get
Return mblnIsSelected
End Get
Set(ByVal value As Boolean)
mblnIsSelected = value
IsChecked = mblnIsSelected
Me.RaisePropertyChanged(Function() Me.IsSelected)
End Set
End Property
EndClass
答案 0 :(得分:1)
看起来第二级模板上的绑定不太正确。
查看树的这种表示形式:
- BaseAppTemplate
---- CategoryTemplate {Binding ... AncestorLevel = 2} Bad!
-------- AppNameTemplate {Binding IsChecked}好!
您会看到,AncestorLevel = n将向上查找绑定项目的第n个父项。 检查树结构,在CategoryTemplate之上没有TreeViewItem 2级别,因此绑定可能失败(尝试并在输出Windows上调试那个)
嗯,这是你的DataTemplate上的一个错误,但我仍然不明白你想要完成什么,所以如果你能提供一个好的视觉样本(就像我绘制的那棵蹩脚的树)那就太棒了