RelativeSource绑定HierarchicalDataTemplate与collectionsviewsource

时间:2015-05-17 12:31:28

标签: wpf data-binding observablecollection collectionviewsource hierarchicaldatatemplate

我已经实现了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

1 个答案:

答案 0 :(得分:1)

看起来第二级模板上的绑定不太正确。

查看树的这种表示形式:

- BaseAppTemplate

---- CategoryTemplate {Binding ... AncestorLevel = 2} Bad!

-------- AppNameTemplate {Binding IsChecked}好!

您会看到,AncestorLevel = n将向上查找绑定项目的第n个父项。 检查树结构,在CategoryTemplate之上没有TreeViewItem 2级别,因此绑定可能失败(尝试并在输出Windows上调试那个)

嗯,这是你的DataTemplate上的一个错误,但我仍然不明白你想要完成什么,所以如果你能提供一个好的视觉样本(就像我绘制的那棵蹩脚的树)那就太棒了