【问题标题】:Empty ComboBoxItem with SelectedValuePath Binding具有 SelectedValuePath 绑定的空 ComboBoxItem
【发布时间】:2016-12-15 13:41:53
【问题描述】:

基于此答案https://stackoverflow.com/a/33109026/426386 我向我的 ComboBox 集合添加了一个空项目。由于我的 Combobox 定义了 SelectedValue 和 SelectedValuePath,我会遇到 Bindingerrors:

    <UserControl.Resources>
        <ObjectDataProvider
            x:Key="CardTypeProvider"
            MethodName="GetLocalizedEnumValues"
            ObjectType="{x:Type base:Localize}">
            <ObjectDataProvider.MethodParameters>
                <x:Type
                    TypeName="base:CardTypes" />
            </ObjectDataProvider.MethodParameters>
        </ObjectDataProvider>
    </UserControl.Resources>

    <ComboBox           
        DisplayMemberPath="Value"
        SelectedValue="{Binding GroupByCardType, UpdateSourceTrigger=PropertyChanged}"
        SelectedValuePath="Key">
        <ComboBox.Resources>
            <CollectionViewSource
                x:Key="Items"
                Source="{Binding Source={StaticResource CardTypeProvider}}" />
        </ComboBox.Resources>
        <ComboBox.ItemsSource>
            <CompositeCollection>
                <TextBlock />
                <CollectionContainer
                    Collection="{Binding Source={StaticResource Items}}" />
            </CompositeCollection>
        </ComboBox.ItemsSource>
    </ComboBox>

ObjectDataProvider 返回以下类型:

Dictionary<Enum, string>

为了避免绑定错误,我想实例化 KeyValuePair&lt;Enum, string&gt; 而不是 TextBlock。有可能吗?

【问题讨论】:

    标签: c# wpf combobox


    【解决方案1】:

    恐怕你不能在 XAML 中创建泛型类型的实例,也不能创建从值类型 KeyValuePair 派生的类型,但你可以创建另一个具有 Key 和 Value 属性的类型并将此实例的一个实例添加到 CompositeCollection:

    public class EmptyItem
    {
        public YourEnum Key { get; set; }
        public string Value { get; set; } = "(Select)";
    }
    

    这应该满足绑定问题。

    另一种选择是以编程方式将实际的 KeyValuePair 添加到集合中,例如:

    CompositeCollection cc = comboBox.ItemsSource as CompositeCollection;
    cc.Insert(0, new KeyValuePair<YourEnum, string>(..., "..."));
    

    【讨论】:

    • 根据stackoverflow.com/a/1708753/426386 我可以为泛型类型建模,但我可以实例化它吗?或者更简单地问:我可以创建类型的实例(或以某种方式包装它)吗?
    • 您不能在 XAML 中创建通用类型的实例。您可以定义一个包装 KeyValuePair 类的非泛型类,或者您可以按照我的回答添加一个 Key 和 Value 属性。所有元素都是某种类型的实例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-06
    • 1970-01-01
    相关资源
    最近更新 更多