WPF ListBox ItemsSource StaticResource / Binding вопрос - PullRequest
6 голосов
/ 18 сентября 2009

С учетом следующего кода:

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

В этом примере

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

Дает мне ошибку с жалобой на невозможность привязки к объекту CollectionViewSource.

Но другой список:

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

отлично связывается.

Итак, мой вопрос: почему один работает, а другой нет? В конце концов, не установлены ли оба ItenSources на один и тот же объект CollectionViewSource?

Спасибо.

1 Ответ

5 голосов
/ 20 сентября 2009

Свойство ItemsSource имеет тип IEnumerable. CollectionViewSource не является IEnumerable. Свойство View в CollectionViewSource предоставит вам IEnumerable.

Когда вы привязываете к CollectionViewSource, Binding достаточно умен, чтобы захватить свойство View и фактически привязаться к нему. Возможно, на CollectionViewSource есть [DefaultBindingProperty].

Это сводится к тому, что когда вы проходите через Binding, вы на самом деле не привязываетесь к CollectionViewSource, а к его свойству View.

...