首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何转换ComboBox以使用绑定的CompositeCollection?

如何转换ComboBox以使用绑定的CompositeCollection?
EN

Stack Overflow用户
提问于 2012-10-06 00:57:45
回答 1查看 1.5K关注 0票数 2

我有一个ComboBox,它有一个绑定的项源...我已经将我的示例精简为关键部分:

代码语言:javascript
复制
<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>

这是可行的,但我现在想在我的组合框中添加一个手动项目,它将触发称为"Other...“的替代功能。所以我不得不转而使用CompositeCollection...如下所示:

代码语言:javascript
复制
<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中的错误或解释我遗漏了什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-06 01:32:13

在ComboBox.Resources中声明绑定并与ItemsSource=“{ CompositeCollection Source={StaticResource myCompositeCollection}}”一起使用。

代码语言:javascript
复制
<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。

在参考资料部分中,像CompositeCollection这样的Freezables继承了它们声明元素的DataContext,就像它们是元素的逻辑子元素一样。然而,这是Resources属性的一个特长,像ContentControl.Content或类似的属性,它们包含控件的逻辑子控件(可能还有其他几个)。如果您使用元素语法来设置属性的值,一般情况下,您将不得不预期DataContext等属性的属性值继承不起作用,因此没有显式来源的绑定也不起作用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12750784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档