2009-09-17 24 views
6

:この例ではWPFのListBoxのItemsSource 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> 

を、

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

は私にそれが "CollectionViewSource" オブジェクトにバインドすることができないことを訴えてエラーを与えます。

しかし、他のリストボックス:

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

は完全に罰金バインドします。

私の質問は、なぜ1つは機能し、もう1つはしないのですか?最後に、両方のItenSourcesが同じ "CollectionViewSource"オブジェクトに設定されていませんか?

ありがとうございます。

答えて

4

ItemsSourceプロパティは、IEnumerable型です。 CollectionViewSourceはIEnumerableではありません。 CollectionViewSourceのViewプロパティは、IEnumerableを提供します。

CollectionViewSourceにバインドすると、バインディングはViewプロパティを取得して実際にバインドするほどスマートです。おそらくCollectionViewSourceには[DefaultBindingProperty]があります。

Bindingを実行すると、実際にはCollectionViewSourceではなく、そのViewプロパティにバインドされているという事実があります。

+0

ありがとうマイク。私は問題が何かを理解します。私の質問は、なぜ単にCollectionViewSourceオブジェクトからプロパティを選んで自由に取っているだけで、バインディングがそれにぶつかっているのかということに、より重点を置いていましたか?つまり、なぜStaticResource拡張が同じことをやる自由を取っていないのでしょうか? – Rene

+2

推測の種類はありますが、StaticResourceは「バインドできるものを手に入れてください」と言っているところで「私にこのことを教えてください」と言っています。 StaticResourceはよりリテラルです。 Bindingでは、システムがリソースを求めている理由を知っていますが、使用法のコンテキストはありません。クリスアンダーソンの本「Essential WPF」だと思います。バインディングが何をすべきかを正確に把握できないときに起きることの順序を記述します。私は便利ではありませんが、私はそれを試してみるでしょう。この場合、何が起こるかは分かります。 –

関連する問題