1

Я уже реализовал 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 
+0

Можете ли вы показать нам структуру данных, связанную с CVS? Кроме того, попробуйте и продемонстрируйте, что требование «привязано ко второму уровню».Я не понимаю, является ли это абсолютным или относительным по отношению к узлу. –

+0

@GabrielRainha - отредактировал вопрос –

ответ

1

Похоже, что связывание на шаблоне второго уровня не совсем верно.

Смотреть это представление дерева:

--BaseAppTemplate

---- CategoryTemplate {Binding ... AncestorLevel = 2} Плохо!

-------- AppNameTemplate {Binding IsChecked} Хорошо!

Вы видите, AncestorLevel = n будет смотреть вверх для n-го родителя связанного элемента. Проверка структуры дерева, нет элементов TreeViewItem 2 поверх CategoryTemplate, так что привязка, вероятно, не работает (попробуйте и отлаживайте ее на выходе Windows)

Ну, это ошибка на вашем DataTemplate, но я все еще не понимаю, чего вы пытаетесь достичь, поэтому, если бы вы могли предоставить хороший визуальный образец (например, это хромое дерево, которое я рисовал), это было бы здорово.

+0

Я пытаюсь связать свойство IsChecked в CategoryTemplate на моем ViewModel - как и я с AppNameTemplate-, но IsChecked на уровне категории не устанавливается, потому что я не получаю доступ к Источнику больше, я обращаюсь к списку называемых элементами. –

+0

Я думаю, что основная проблема заключается в том, что я не знаю, как манипулировать элементами, если они не находятся на листовом узле. У меня нет доступа к этой коллекции Items на родительских уровнях. Также есть способ, которым я могу связывать Источник CollectionViewSource и использовать элементы thouse для привязки? –

+0

Я попытаюсь воспроизвести его позже, если никто не ответит на него, чтобы дать вам точный ответ. –

Смежные вопросы