2009-09-17 14 views
6

Dado el siguiente código:WPF ListBox ItemsSource StaticResource/pregunta de encuadernación

<Window x:Class="WpfApplication76.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:col="clr-namespace:System.Collections;assembly=mscorlib" 
    Title="Window1" Height="300" Width="300"> 

    <Window.Resources> 
     <CollectionViewSource x:Key="myCol"> 
      <CollectionViewSource.Source> 
       <col:ArrayList> 
        <ListBoxItem>Uno</ListBoxItem> 
        <ListBoxItem>Dos</ListBoxItem> 
        <ListBoxItem>Tres</ListBoxItem> 
       </col:ArrayList> 
      </CollectionViewSource.Source> 
     </CollectionViewSource> 
    </Window.Resources> 

    <Grid> 
     <ListBox ItemsSource="{StaticResource myCol}" /> 
     <ListBox ItemsSource="{Binding Source={StaticResource myCol}}" /> 
    </Grid> 

</Window> 

En este ejemplo, el

<ListBox ItemsSource="{StaticResource myCol}" /> 

me da un error quejándose de que no se puede unir a un objeto "CollectionViewSource".

Pero el otro cuadro de lista:

<ListBox ItemsSource="{Binding Source={StaticResource myCol}}" /> 

se une perfectamente bien.

Entonces mi pregunta es ¿por qué funciona uno y el otro no? Al final, ¿no están ambos ItenSources configurados en el mismo objeto "CollectionViewSource"?

Gracias.

Respuesta

4

La propiedad ItemsSource es del tipo IEnumerable. Un CollectionViewSource no es un IEnumerable. La propiedad de vista de CollectionViewSource le dará un IEnumerable.

Cuando enlaza a un CollectionViewSource, el Enlace es lo suficientemente inteligente como para tomar la propiedad Ver y vincularse a eso. Quizás CollectionViewSource tiene una [DefaultBindingProperty] en ella.

Se reduce al hecho de que cuando se realiza el Enlace no se vincula realmente a CollectionViewSource, sino a su propiedad Ver.

+0

Gracias Mike. Me doy cuenta de cuál es el problema. Mi pregunta realmente se orientó más hacia por qué el Binding se toma la libertad de simplemente elegir una propiedad del objeto "CollectionViewSource" y simplemente aferrarse a eso. Quiero decir, ¿por qué la extensión "StaticResource" no se está tomando la libertad de hacer lo mismo también? – Rene

+2

Es una especie de conjetura, pero StaticResource solo está diciendo "tráeme esto" mientras que Binding dice "dame algo a lo que pueda enlazar". StaticResource es más literal. No tiene contexto de uso, mientras que con Binding el sistema sabe por qué está pidiendo el recurso. El libro de Chris Anderson, "WPF esencial", creo. Describe el orden de las cosas que sucede cuando un Enlace no puede determinar exactamente qué hacer. No lo tengo a mano, pero intentaré buscarlo. Podría decir lo que sucede en este caso. –