【问题标题】:RelativeSource binding HierarchicalDataTemplate with collectionviewsourceRelativeSource 将 HierarchicalDataTemplate 与 collectionviewsource 绑定
【发布时间】:2015-05-17 12:31:28
【问题描述】:

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

有人可以帮助我了解如何将复选框 IsChecked 属性绑定到树视图第二级集合的 ViewModel 上的属性。

我正在尝试创建这样一种情况,即如果检查了子项,则也会检查父节点,反之亦然。

我认为主要问题是我不知道如何操作项目,除非它们位于叶节点上,否则我无法访问父级别中的项目集合..

还有一种方法可以绑定 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>

数据模板

 <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 有以下源码和模板:

ItemsSource="{Binding Source={StaticResource CSV}, Path=Groups}"
                                                         ItemTemplate="{StaticResource BaseAppTemplate}"

更多详情

ReadOnly Property TestApplications As ObservableCollection(Of ToolBaseModel)

** 基础模型**

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

【问题讨论】:

  • 你能告诉我们绑​​定到 CVS 的数据结构吗?此外,尝试并举例说明“绑定到第二级”的要求。我不知道它是绝对的还是相对于节点的。
  • @GabrielRainha - 编辑了问题

标签: wpf data-binding observablecollection collectionviewsource hierarchicaldatatemplate


【解决方案1】:

二级模板上的绑定好像不太对。

查看你的树的这个表示:

--BaseAppTemplate

----CategoryTemplate {Binding ... AncestorLevel=2} 错误!

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

你看,AncestorLevel=n 将向上查找绑定项的第 n 个父项。 检查您的树结构,CategoryTemplate 顶部没有 TreeViewItem 2 级别,因此绑定可能失败(尝试在输出窗口上调试该级别)

嗯,这是您的 DataTemplate 上的一个错误,但我仍然不明白您要完成什么,所以如果您能提供一个好的视觉示例(比如我画的那棵跛脚树),那就太好了.

【讨论】:

  • 我正在尝试在我的 ViewModel 上绑定 CategoryTemplate 的 IsChecked 属性 - 就像我对 AppNameTemplate 所做的那样 - 但类别级别中的 IsChecked 没有设置,因为我不再访问源我正在访问列表称为项目。
  • 我认为主要问题是我不知道如何操作项目,除非它们位于叶节点上,否则我无法访问父级别中的项目集合.. 还有一种方法我可以绑定 CollectionViewSource 的 Source 并使用 thouse 项目绑定到?
  • 如果没有人回答,我会尝试复制它,以便给你一个准确的答案。
  • 好的,谢谢,我只需要知道如何将类别级别绑定到与 appNameTemplate 级别相同的集合 - 我需要为所有级别更改相同的集合
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-27
  • 1970-01-01
  • 2011-06-28
  • 1970-01-01
  • 1970-01-01
  • 2014-09-27
  • 1970-01-01
相关资源
最近更新 更多