我已经实现了一个TreeView
,并在视图模型中使用绑定到ObserableCollection
的CollectionViewSource
填充它。(下面的代码)
有人能帮我理解我是如何将复选框IsChecked属性绑定到树视图的第二级集合的ViewModel属性上的。
我试图创建的情况下,如果一个子项目被选中,那么父节点也被选中,反之亦然。
我认为主要的问题是,我不知道如何操纵项目,除非他们在叶节点上,否则我无法访问父级别的项目集合。
也有一种方法,我可以绑定的CollectionViewSource的源和使用房屋项目绑定到?
欢迎任何提示或代码示例
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}"
More Detail
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
看起来第二层模板的绑定不太对。
查看树的表示:
——BaseAppTemplate
----CategoryTemplate {Binding…AncestorLevel = 2}坏!
--------AppNameTemplate {Binding IsChecked}好!
您可以看到,AncestorLevel=n将向上查找绑定项的第n个父项。检查你的树结构,在CategoryTemplate上面没有TreeViewItem 2级,所以绑定可能失败(尝试在输出窗口上调试那个)
嗯,这是你的DataTemplate上的一个错误,但我仍然不明白你想要完成什么,所以如果你能提供一个好的视觉样本(就像我画的蹩脚的树),那将是伟大的