2009-09-17 18 views
6

Dato il seguente codice:WPF ListBox ItemsSource StaticResource/domanda Binding

<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> 

In questo esempio, il

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

mi dà un errore dice che non è in grado di legarsi a un oggetto "CollectionViewSource".

Ma l'altra casella di riepilogo:

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

lega perfettamente bene.

Quindi la mia domanda è: perché uno lavora e l'altro no? Alla fine, non sono entrambe le ItenSources impostate sullo stesso oggetto "CollectionViewSource"?

Grazie.

risposta

4

La proprietà ItemsSource è di tipo IEnumerable. Un CollectionViewSource non è un oggetto IEnumerable. La proprietà View di CollectionViewSource ti darà un oggetto IEnumerable.

Quando si esegue il binding a un oggetto CollectionViewSource, il binding è sufficientemente intelligente per acquisire la proprietà View e in effetti associarsi a tale. Forse CollectionViewSource ha una [DefaultBindingProperty] su di esso.

Si riduce al fatto che quando si esegue il binding non si esegue effettivamente il binding a CollectionViewSource, ma la relativa proprietà View.

+0

Grazie Mike. Capisco qual è il problema. La mia domanda era davvero più orientata al perché Binding si prendesse la libertà di scegliere semplicemente una proprietà dall'oggetto "CollectionViewSource" e si limitasse a questo? Voglio dire, perché l'estensione "StaticResource" non si sta prendendo la libertà di fare la stessa cosa? – Rene

+2

Tipo di supposizione, ma StaticResource sta solo dicendo "fammi questa cosa", dove Binding sta dicendo "fammi qualcosa che posso legare". StaticResource è più letterale. Non ha contesto di utilizzo, mentre con Binding il sistema sa perché stai chiedendo la risorsa. Il libro di Chris Anderson, "Essential WPF", penso. Descrive l'ordine delle cose che accadono quando un legame non riesce a capire esattamente cosa fare. Non ce l'ho a portata di mano, ma proverò a cercarlo. Potrebbe dire cosa succede in questo caso. –

Problemi correlati