2010-07-28 10 views
12

'ContentTemplate' es un DataTemplate que muestra un objeto que tiene un miembro 'FooList' (un ObservableCollection).Enlazando un CollectionViewSource dentro de un DataTemplate

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

Necesito poder filtrar ese FooList usando un CollectionViewSource. Por lo general, esto ha sido sencillo, pero parece que no puedo lograr que el enlace funcione en una plantilla de datos. Me trató de esto:

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

Los errores que recibo de esto es:

System.Windows.Data de error: 2: No se puede encontrar FrameworkElement de gobierno o FrameworkContentElement de elemento de destino. BindingExpression: Path = FooList; DataItem = null; el elemento de destino es 'CollectionViewSource' (HashCode = 52991666); target property es 'Fuente' (tipo 'Objeto')

Lo que me parece que está buscando 'FooList' en CollectionViewSource en lugar del objeto vinculado al DataTemplate.

Entonces ... ¿cómo hago para ver el objeto correcto?

+0

Estoy teniendo el mismo problema. Lo único que se me ocurre es que el CVS no sabe la fuente correcta del enlace (su miembro 'Foolista') que debería ser el DataContext en este nivel. ¿Hay alguna manera de establecer explícitamente la fuente en el CVS al DataContext actual de DataTemplate? Una vez más, se debe suponer, pero esto no funciona para los dos. (La única diferencia entre el tuyo y el mío es que estás vinculando a un ListBox interno. Estoy vinculado a los elementos secundarios de una HierarchicalDataTemplate para usar en una vista de árbol. Pero aparte de eso, tú y yo estamos en el mismo barco. – MarqueIV

+0

Me parece que se supone que no debe tener acceso a los datos de DataTemplate dentro de la parte del recurso. ¿Alguien sabe si es correcto? –

Respuesta

0

Creo que se necesita para unirse a la vista de la CollectionViewSource:

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

Acabo de publicar una pregunta similar también. Intenté su solución de especificar explícitamente 'Ver' para la ruta, pero no funciona. Además, cuando normalmente se vincula a un CVS, no especifica 'Ver' para la ruta de todos modos, así que no estoy seguro de lo que habría dado. Sin embargo, no estoy seguro de por qué este código no funciona de todos modos, así que también hay. – MarqueIV

+0

Su código no funciona. CollectionViewSource es un proxy XAML para acceder a CollectionView, no necesita especificar la ruta. –

0

trabajé evitar este problema moviendo la plantilla de datos en un control de usuario.

22

Según tengo entendido, DataTemplate actúa como instrucciones sobre qué insertar en el árbol visual, pero no se convierte en una parte del árbol visual en sí. Solo llegué a esta hipótesis después de encontrarme con el mismo problema que describiste arriba. Solucioné el problema adjuntando CollectionViewSource a los recursos de un elemento que sería parte del árbol visual, en mi caso una cuadrícula. Aquí está la muestra que funcionó:

<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

¡Eres increíble! Esto solucionó el problema. problema con el que me encontré. ¡Gracias! – Scott

+0

¡Funciona muy bien! ¡Gracias! –

Cuestiones relacionadas