Я уже реализовал TreeView
и заполнил его, используя CollectionViewSource
, связанный с ObserableCollection
в модели просмотра. (код ниже)RelativeSource binding HierarchicalDataTemplate with collectionviewsource
Может кто-нибудь помочь мне понять, как мне возможно связать флажок IsChecked с собственностью в ViewModel коллекции на втором уровне древовидного вида.
Я пытаюсь создать ситуацию, где, если отмечены дочерние элементы, тогда также проверяется родительский узел и наоборот.
Я думаю, что главная проблема заключается в том, что я не знаю, как манипулировать элементы, если они не находятся на листовом узле еще у меня нет доступа к этой коллекции Items в родительских уровнях ..
также есть способ что я могу связать источник 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}"
Более подробно
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
Можете ли вы показать нам структуру данных, связанную с CVS? Кроме того, попробуйте и продемонстрируйте, что требование «привязано ко второму уровню».Я не понимаю, является ли это абсолютным или относительным по отношению к узлу. –
@GabrielRainha - отредактировал вопрос –