2016-08-08 90 views
0

Ich möchte, dass Beispieldaten während der Entwurfszeit in meinem Treeview angezeigt werden. Meine Treeview enthält verschachtelte TreeViews und CollectionViewSources.Entwurfszeit-Treeview-Bindung mit CollectionViewSources-Gruppen und HierarchicalDataTemplate

Ich möchte herausfinden, wie die verschachtelten Treeviews angezeigt werden können (nur die erste von 3 Knotenstufen wird derzeit angezeigt).

Über den Treeview

Hier ist, was ich bisher herausgefunden:

Meine Treeview Hierarchical-Daten (Objektzustände (zB "Ready")> Datum (zB „08.08/enthält . 16")> Name (zB "Äpfel"), aber ich kann nur einen bekommen

Der Treeview wird unterstützt von:

  • ObjectTreeviewViewModel (ein ObservableColle ction)
  • Collection zur Gruppe von StateDisplay (+ Sortierung)
  • Eine weitere Collection zur Gruppe von ObjectDateDisplay

derzeitiger Status

Die ObjectTreeview nur eine Ebene von Knoten zur Entwurfszeit zeigt, wenn Ich erwarte 3 Ebenen von Knoten.

Treeview (WPF) only shows 1 level of nodes in design time- should show 3

Mein Stapel

Ich baue eine WPF-Anwendung auf .net 4.5, Visual Studio 2015

-Code

XAML

<UserControl x:Class="myproject.app.views.MainWindow.ObjectTreeview" 
          xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
          xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
          xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
          mc:Ignorable="d" 
          d:DesignHeight="300" d:DesignWidth="300" 
          DataContext="{Binding RelativeSource={RelativeSource Self}}" 
          > 

      <UserControl.Resources> 

        <ResourceDictionary> 
          <ResourceDictionary.MergedDictionaries> 
            <ResourceDictionary Source="../../resources/MainWindow/ObjectTreeviewResources.xaml"></ResourceDictionary> 
          </ResourceDictionary.MergedDictionaries> 
        </ResourceDictionary> 

      </UserControl.Resources> 

      <TreeView x:Name="Treeview" 
             ItemsSource="{Binding Source={StaticResource ObjectStateCollectionViewSource}, Path=Groups}" 
             ItemTemplate="{Binding Source={StaticResource ObjectStateTemplate}}"> 
      </TreeView> 

    </UserControl> 

XAML-Ressourcen

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
              xmlns:componentModel="clr-namespace:System.ComponentModel;assembly=WindowsBase" 
              xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
              xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
              xmlns:pf="clr-namespace:System.ComponentModel;assembly=PresentationFramework" 
              xmlns:mainWindow="clr-namespace:myproject.app.viewmodels.MainWindow" 
              mc:Ignorable="d"> 

      <!-- I.e. Level-3 Node (i.e. Leaf nodes) --> 
      <DataTemplate x:Key="ObjectTreeviewNode"> 
        <TextBlock Text="{Binding ObjectNameDisplay}"/> 
      </DataTemplate> 


      <!-- Initial Grouping: Group by object states --> 
      <CollectionViewSource x:Key="ObjectStateCollectionViewSource" 
                 Source="{Binding Path=ObjectTreeviewViewModel.TreeviewCollection}" 
                 d:DesignSource="{d:DesignData Source=ObjectTreeviewDesignTimeData.xaml}" 
                 > 
        <CollectionViewSource.GroupDescriptions> 
          <PropertyGroupDescription PropertyName="StateDisplay"/> 
        </CollectionViewSource.GroupDescriptions> 
        <CollectionViewSource.SortDescriptions> 
          <componentModel:SortDescription PropertyName="StateEnum" /> 
          <componentModel:SortDescription PropertyName="ObjectDate" /> 
          <componentModel:SortDescription PropertyName="ObjectNameDisplay" /> 
        </CollectionViewSource.SortDescriptions> 
      </CollectionViewSource> 

      <!-- I.e. Level-2 Node (i.e. mid-nodes) --> 
      <HierarchicalDataTemplate x:Key="ObjectDateTemplate"> 
        <TreeView BorderThickness="0"> 
          <TreeViewItem Header="{Binding Path=Name}" 
                 ItemsSource="{Binding Path=Items}" 
                 d:DataContext="{Binding Path=Items}" 
                 ItemTemplate="{StaticResource ResourceKey=ObjectTreeviewNode}" 
                 IsExpanded="True"/> 
        </TreeView> 
      </HierarchicalDataTemplate> 

      <!-- I.e. Level-1 Node (i.e. Root nodes) --> 
      <HierarchicalDataTemplate x:Key="ObjectStateTemplate" > 
        <TreeView BorderThickness="0"> 

          <TreeView.Resources> 

            <!-- Sub-grouping: Group by object dates (This needs to be nested in this Treeview.Resources) --> 
            <CollectionViewSource x:Key="ObjectDateCollectionViewSource" 
                       Source="{Binding Path=Items}" 
                       d:DesignSource="{Binding Path=Items}" 
                       > 

              <CollectionViewSource.GroupDescriptions> 
                <PropertyGroupDescription PropertyName="ObjectDateDisplay"/> 
              </CollectionViewSource.GroupDescriptions> 

            </CollectionViewSource> 

            <!-- [This and all children] Hide the light-grey inactive background --> 
            <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="Transparent" /> 

          </TreeView.Resources> 

          <TreeViewItem Header="{Binding Path=Name}" 
                 ItemsSource="{Binding Source={StaticResource ObjectDateCollectionViewSource}, Path=Groups}" 
                 ItemTemplate="{StaticResource ObjectDateTemplate}" 
                 IsExpanded="True"/> 

        </TreeView> 
      </HierarchicalDataTemplate> 
    </ResourceDictionary> 

-Code-Behind

using System.Windows.Controls; 
    using myproject.app.viewmodels.MainWindow; 
    using myproject.lib.enumerations; 

    namespace myproject.app.views.MainWindow 
    { 
      /// <summary> 
      /// Interaction logic for ObjectTreeview.xaml 
      /// </summary> 
      public partial class ObjectTreeview : UserControl 
      { 
        public ObjectTreeviewViewModel ObjectTreeviewViewModel { get; private set; } = new ObjectTreeviewViewModel(); // this is a ObservableCollection<ObjectViewModel> 

        public ObjectTreeview() 
        { 
          InitializeComponent(); 
        } 

        /// <summary> 
        ///  Load object for an objectStateGroup (a set of ObjectStates) into the collection that backs the treeview. 
        /// </summary> 
        /// <param name="objectStateGroup">The objectStateGroupsEnum to load.</param> 
        public void LoadObjectStateGroup(objectStateGroupsEnum objectStateGroup) 
        { 
          ObjectTreeviewViewModel.LoadobjectStateGroup(objectStateGroup); 
        } 
      } 
    } 

Antwort

0

fand ich eine Abhilfe für mein Problem.

Die Ausgabe

Das Problem mit der inneren Collection war (die, die in der Mitte von 3 Knoten gesteuert). Nur die äußere CollectionViewSource zeigte ihren Knoten an.

Die Entwurfszeitbindung konnte nicht dieselbe Path=Items verwenden, die die Laufzeit verwendete.

<CollectionViewSource x:Key="ObjectDateCollectionViewSource" 
         Source="{Binding Path=Items}" 
         d:DesignSource="{Binding Path=Items}"> 

       <CollectionViewSource.GroupDescriptions> 
           <PropertyGroupDescription PropertyName="ObjectDateDisplay"/> 
       </CollectionViewSource.GroupDescriptions> 

</CollectionViewSource> 

Die Lösung

Aktualisieren der d: DesignSource aus der XAML-Beispiel-Datei zu laden (das gleiche, die wir oben verwenden) mit Source=ObjectTreeviewDesignTimeData.xaml.

<CollectionViewSource x:Key="ObjectDateCollectionViewSource" 
          Source="{Binding Path=Items}" 
          d:DesignSource="{d:DesignData Source=ObjectTreeviewDesignTimeData.xaml}"> 

      <CollectionViewSource.GroupDescriptions> 
        <PropertyGroupDescription PropertyName="ObjectDateDisplay"/> 
      </CollectionViewSource.GroupDescriptions> 

    </CollectionViewSource> 

Nach dem Einstellen der d: DesignSource und wieder aufzubauen, die drei Ebenen der Knoten gestartet zur Entwurfszeit erscheinen. Ich habe bestätigt, dass das Problem mit der Entwurfszeitbindung mit der inneren CollectionViewSource zusammenhängt.

eine ausreichende Abhilfe

zum gleichen Wörterbuch in dem äußeren und inneren CollectionViewSources, werden redundante Daten, die durch die Bindung. (Das Wörterbuch wird für jede Unterstrukturansicht mehrfach geladen.) Dies ist jedoch OK, da ich mich im Designer-Modus befinde und nur Platzhalterdaten benötige.

Eine bessere Lösung wäre, einen Weg zu finden, den inneren CVS d:DesignerSource="{BETTER_SOLUTION_HERE}" Teil mit der gleichen Sammlung wie der äußere CVS zu arbeiten.