2010-07-28 17 views
12

'ContentTemplate' è un DataTemplate che visualizza un oggetto che ha un membro 'FooList' (ObservableCollection).Binding a CollectionViewSource in un DataTemplate

<DataTemplate x:Key="ContentTemplate"> 
    <ListBox ItemsSource="{Binding Path=FOO}"> 
     ... 
    </ListBox> 
</DataTemplate> 

Devo essere in grado di filtrare FooList utilizzando una CollectionViewSource. Questo è in genere semplice ma non riesco a far funzionare l'associazione all'interno di un DataTemplate. Ho tentato di questo:

<DataTemplate x:Key="ContentTemplate"> 
    <DataTemplate.Resources> 
     <CollectionViewSource x:Key="CVS" Source="{Binding Path=FooList}" Filter="FooFilter"/> 
    <DataTemplate.Resources> 
    <ListBox ItemsSource="{Binding Source={StaticResource CVS}}"> 

Gli errori che ricevo da questo è:

System.Windows.Data Errore: 2: Impossibile trovare governare FrameworkElement o FrameworkContentElement per elemento di destinazione. BindingExpression: Path = FooList; DataItem = null; l'elemento target è 'CollectionViewSource' (HashCode = 52991666); La proprietà target è 'Origine' (tipo 'Oggetto')

A me sembra che stia cercando "FooList" su CollectionViewSource anziché sull'oggetto associato a DataTemplate.

Quindi ... come posso ottenere questo per vedere l'oggetto corretto?

+0

Ho lo stesso problema. L'unica cosa che posso pensare è che il CVS non conosce la fonte corretta per il binding (il tuo membro 'FooList') che dovrebbe essere il DataContext a questo livello. C'è un modo per impostare esplicitamente la sorgente sul CVS al DataContext corrente del DataTemplate? Ancora una volta, dovrebbe essere assunto, ma questo non funziona per entrambi. (L'unica differenza tra la tua e la mia è che ti stai legando a un ListBox interno. Sono vincolante per gli elementi secondari di un HierarchicalDataTemplate da usare in una vista ad albero. Ma a parte questo, tu ed io siamo nella stessa barca. – MarqueIV

+0

Mi sembra che non si supponga di avere accesso ai Dati del DataTemplate all'interno della parte della risorsa.Qualcuno sa se è corretto? –

risposta

0

Penso che avete bisogno di legarsi alla vista del CollectionViewSource:

<ListBox ItemsSource="{Binding Path=View, Source={StaticResource CVS}}"> 
+0

Appena pubblicato anche una domanda simile. Ho provato la tua soluzione di specificare esplicitamente 'Visualizza' per il percorso, ma non funziona. Inoltre, quando normalmente si associa a un CVS, non si specifica "Visualizza" per il percorso, quindi non sono sicuro di ciò che avrebbe dato. sicuro perché questo codice non funziona comunque c'è anche quello – MarqueIV

+0

Il tuo codice non funzionerà. CollectionViewSource è un proxy XAML per accedere a CollectionView, non è necessario specificare il percorso. –

0

ho lavorato intorno a questo problema spostando il modello di dati in un controllo utente.

22

Come ho capito, DataTemplate funge da istruzioni su cosa inserire nell'albero visivo ma non diventa parte dell'albero visivo stesso. Sono arrivato a questa ipotesi solo dopo aver incontrato lo stesso problema che hai descritto sopra. Ho risolto il problema collegando CollectionViewSource alle risorse di un elemento che sarebbe parte dell'albero visivo, nel mio caso una griglia. Ecco l'esempio che ha funzionato:

<DataTemplate DataType="{x:Type TypedLists:AssetModelListViewModel}"> 
    <Grid> 
     <Grid.Resources> 
      <CollectionViewSource x:Key="items" 
            Source="{Binding}"> 
       <CollectionViewSource.SortDescriptions> 
        <scm:SortDescription PropertyName="AssetType.AssetCategory.Name" /> 
        <scm:SortDescription PropertyName="AssetType.Name" /> 
        <scm:SortDescription PropertyName="Manufacturer.Name" /> 
       </CollectionViewSource.SortDescriptions> 
      </CollectionViewSource> 
     </Grid.Resources> 

     <ListView ItemsSource="{Binding Source={StaticResource items}}"> 

     </ListView> 
    </Grid> 
</DataTemplate> 
+0

Sei fantastico! problema ho incontrato. Grazie! – Scott

+0

Funziona alla grande! Grazie! –

Problemi correlati