Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

WPF ListBox ItemsSource StaticResource/Binding question

Given the following code:

<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 this example, the

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

Gives me an error complaining that it cannot bind to a "CollectionViewSource" object.

But the other listbox:

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

binds perfectly fine.

So my question is why does one work and the other one does not? AT the end, aren't both ItenSources being set to the same "CollectionViewSource" object?

Thank you.

like image 795
Rene Avatar asked Sep 17 '09 21:09

Rene


1 Answers

The ItemsSource property is of type IEnumerable. A CollectionViewSource is not an IEnumerable. CollectionViewSource's View property will give you an IEnumerable.

When you Bind to a CollectionViewSource the Binding is smart enough to grab the View property and actually bind to that. Maybe CollectionViewSource has a [DefaultBindingProperty] on it.

It boils down to the fact that when you go through the Binding you don't actually bind to the CollectionViewSource, but its View property.

like image 154
Mike Two Avatar answered Nov 15 '22 16:11

Mike Two