5

È possibile utilizzare in modo esplicito una CollectionViewSource all'interno di un modello di dati? Normalmente inseriamo CollectionViewSource nelle risorse insieme al modello, ma il nostro modello non lo consente perché la "fonte" di collectionviewsource è una proprietà di DataContext a questo livello nell'albero, il che significa che deve esserci un'istanza a questo livello Inserirlo nella radice delle risorse significherebbe che c'era solo un'istanza. Inoltre, non possiamo semplicemente utilizzare il raggruppamento a livello esterno in quanto questi elementi non esistono finché non sei così in basso nella gerarchia, e non tutti i fratelli hanno persino questa proprietà. Quindi ha senso logicamente che istanziare il CollectionViewSource all'interno del DataTemplate (in questo caso un HierarchicalDataTemplate, ma è irrilevante.)È possibile utilizzare un oggetto CollectionViewSource all'interno di un DataTemplate?

In particolare, stiamo cercando di consentire uno specifico ordinamento a questo particolare livello di nodo. La nostra unica altra scelta è quella di ordinare nel ViewModel stesso, ma questo diventa un problema dal momento che stiamo usando ObservableCollections che a loro volta non supportano l'ordinamento. In realtà, ogni articolo che abbiamo visto sull'argomento afferma che dovresti usare una CollectionViewSource proprio per questo motivo, quindi questa domanda.

Ad esempio, questo funziona ...

<HierarchicalDataTemplate x:Key="CategoryTemplate" 
    ItemTemplate="{StaticResource TreeViewSymbolTemplate}" 
    ItemsSource="{Binding Symbols}"> 

    <TextBlock Text="{Binding Name}" FontWeight="Bold" /> 

</HierarchicalDataTemplate> 

ma questo non ...

<HierarchicalDataTemplate x:Key="CategoryTemplate" 
    ItemTemplate="{StaticResource TreeViewSymbolTemplate}"> 

    <HierarchicalDataTemplate.ItemsSource> 
     <Binding> 
      <Binding.Source> 
       <CollectionViewSource Source="{Binding Symbols}" /> 
      </Binding.Source> 
     </Binding> 
    </HierarchicalDataTemplate.ItemsSource> 

    <TextBlock Text="{Binding Name}" FontWeight="Bold" /> 

</HierarchicalDataTemplate> 

mi sembra che sarebbe, ma non è così. Ancora una volta, non possiamo mettere lo strumento CollectionViewSource allo stesso livello del modello di dati perché deve esistere un'istanza per modello poiché ognuno ha il proprio insieme di elementi (sebbene condividano tutti i criteri di ordinamento).

M

+0

piacerebbe davvero avere una risposta qui più appropriato per il modo originale di farlo, o anche se il CollectionViewSource era dentro la parte delle risorse del DataTemplate. –

+1

In realtà, ho trovato un modo ancora più semplice per farlo che mi piace davvero ... Sposto semplicemente CollectionViewSource in un convertitore e lo uso per impostare il valore restituito. Per ora ci stiamo solo "rilanciando" a tempo vincolante poiché è tutto ciò che dobbiamo fare, ma tecnicamente potremmo restituire quelli pre-idratati ai quali abbiamo riferimenti in base alle necessità. Accidenti se mi chiedi e lavora come un campione! – MarqueIV

+0

Lo esaminerò. Grazie. –

risposta

3

Ok ... quindi questo non è esattamente quello che volevo fare, ma il risultato è esattamente lo stesso, e nessuno ha mai commentato, per non dire ha risposto, quindi il mio mettere questo come uno.

Il motivo originale per cui dovevamo farlo era quello di avere l'ordinamento specifico del nodo. Mentre non abbiamo mai fatto funzionare CollectionViewSource, siamo riusciti ad applicare l'ordinamento direttamente ai nodi. Il trucco è farlo o al momento della creazione del nodo, o come lo stiamo facendo, quando il nodo si espande (stiamo usando il binding quindi non creiamo manualmente i nodi.)

Nota che il nostro codice attuale tiene traccia se abbiamo già applicato l'ordinamento al nodo in questione in modo che non venga eseguito su ciascun evento "Espanso", ma tale codice è irrilevante per questa domanda, quindi l'ho omesso per brevità. Comunque, dovresti aggiungere qualcosa di simile.

In ogni caso, ecco come si può fare per nodo di smistamento ...

private void tvSymbols_Expanded(object sender, RoutedEventArgs e) { 

    TreeViewItem node = e.OriginalSource as TreeViewItem; 
    if(node==null) return; 
    node.Items.SortDescriptions.Clear(); 
    node.Items.SortDescriptions.Add(new SortDescription("SomeField",  ListSortDirection.Ascending)); 
    node.Items.SortDescriptions.Add(new SortDescription("SomeOtherField", ListSortDirection.Descending)); 

} 

Naturalmente se qualcuno capisce ancora il motivo per cui il codice del domanda iniziale non ha funzionato, fammi sapere!

Mark

Problemi correlati