RelativeSource binding HierarchicalDataTemplate with collect



我已经实现了一个TreeView,并在视图模型中使用绑定到ObserableCollectionCollectionViewSource填充它。(下面的代码)

有人能帮我理解我是如何将复选框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上的一个错误,但我仍然不明白你想要完成什么,所以如果你能提供一个好的视觉样本(就像我画的蹩脚的树),那将是伟大的

相关内容

  • 没有找到相关文章

最新更新