2

バインドされた項目ソースを持つ ComboBox があります...私は例を重要な部分に落としました:

<UserControl x.Class="My.Application.ClientControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"                         
             xmlns:conv="clr-namespace:My.Utilities.Converters"
             Name="ClientControl">

    <UserControl.Resources>
        <ResourceDictionary>
            <CollectionViewSource Key="x:ClientsCollection" />
        </ResourceDictionary>

        <conv:ClientOptions x:Key="ClientOptions" />

    </UserControl.Resources>

    ...

    <ComboBox Name="Options" 
              DataContext="ClientsCollection" 
              ItemsSource="{Binding [ClientNumber], Converter={StaticResource ClientOptions}" />

</UserControl>

これは機能しますが、「その他...」と呼ばれる代替機能をトリガーする単一の手動項目をコンボボックスに追加したいので、CompositeCollection の使用に移行する必要があります...次のように:

<ComboBox Name="Options"
          DataContext="ClientsCollection">
    <ComboBox.ItemsSource>
        <CompositeCollection>

            <CollectionContainer Collection="{Binding [ClientNumber], Converter={StaticResource ClientOptions} />
            <ComboBoxItem>Other...</ComboBoxItem>
        </CompositeCollection>
</ComboBox>

CompositeCollection を使用すると、バインドされたアイテムが取り込まれません。マニュアルの ComboBoxItem "Other..." のみが表示されます。そのアイテムを削除すると、リストは空になります。コンバーターにブレークポイントをアタッチすると、何もキャッチされません。これは、バインディングが試行されていないことを示しているようです。

CompositeCollection のバインド機能がどのように発生しているかについて、明らかに理解していません。誰かが私の XAML のエラーを確認したり、不足しているものを説明したりできますか?

4

1 に答える 1

2

ComboBox.Resources で CompositeCollection を宣言し、 ItemsSource="{Binding Source={StaticResource myCompositeCollection}}" で使用します。

<UserControl x.Class="My.Application.ClientControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"                         
         xmlns:conv="clr-namespace:My.Utilities.Converters"
         Name="ClientControl">

<UserControl.Resources>
    <ResourceDictionary>
        <CollectionViewSource Key="x:ClientsCollection" />
    </ResourceDictionary>

    <conv:ClientOptions x:Key="ClientOptions" />
    <CompositeCollection x:Key="myCompositeCollection">

        <CollectionContainer Collection="{Binding Source={StaticResource ClientsCollection}, Path=[ClientNumber], Converter={StaticResource ClientOptions} />
        <ComboBoxItem>Other...</ComboBoxItem>
    </CompositeCollection>

</UserControl.Resources>

...

<ComboBox Name="Options" 
          DataContext="ClientsCollection" 
          ItemsSource="{Binding Source={StaticResource myCompositeCollection}}" />

要素構文の ItemsSource プロパティ内で CompositeCollection を宣言すると、CollectionContainer.Collection のバインディングはその DataContext を見つけられません。

Resources セクション内では、CompositeCollection などの Freezable は、要素の論理的な子であるかのように、宣言要素の DataContext を継承します。ただし、これは Resources プロパティと ContentControl.Content のようなプロパティ、またはコントロールの論理的な子 (およびその他のいくつか) を含む同様のプロパティの特殊性です。要素構文を使用してプロパティの値を設定する場合、一般に、DataContext などのプロパティのプロパティ値の継承が機能しないことを期待する必要があるため、明示的な Source のないバインディングも機能しません。

于 2012-10-05T17:32:12.787 に答える