WPF ListBox ItemsSource StaticResource/Binding问题

Ren*_*ene 6 wpf binding wpf-controls staticresource

给出以下代码:

<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>
Run Code Online (Sandbox Code Playgroud)

在这个例子中,

<ListBox ItemsSource="{StaticResource myCol}" />
Run Code Online (Sandbox Code Playgroud)

给我一个错误,抱怨它无法绑定到"CollectionViewSource"对象.

但是另一个列表框:

<ListBox ItemsSource="{Binding Source={StaticResource myCol}}" />
Run Code Online (Sandbox Code Playgroud)

结合完美.

所以我的问题是为什么一个工作而另一个不工作?最后,是不是两个ItenSources都设置为相同的"CollectionViewSource"对象?

谢谢.

Mik*_*Two 5

ItemsSource属性的类型为IEnumerable.CollectionViewSource不是IEnumerable.CollectionViewSource的View属性将为您提供IEnumerable.

绑定到CollectionViewSource时,Binding非常智能,可以抓取View属性并实际绑定到该属性.也许CollectionViewSource上有一个[DefaultBindingProperty].

它归结为这样一个事实:当你完成Binding时,你实际上并没有绑定到CollectionViewSource,而是它的View属性.

  • 有点猜测,但StaticResource只是在说"让我这个东西",而Binding正在说"给我一些我可以绑定的东西".StaticResource更直观.它没有使用上下文,而使用Binding,系统知道你要求资源的原因.我认为Chris Anderson的书"Essential WPF".描述当Binding无法确切知道要做什么时发生的事情的顺序.我没有它的方便,但我会尝试查找它.它可能会说明在这种情况下会发生什么. (2认同)