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“其他...”。如果我删除该项目,则列表为空。如果我将断点附加到转换器,它不会捕获任何东西,这似乎表明甚至没有尝试绑定。

我显然不了解 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 回答