ComboBox MultiBinding如何绑定到SelectedItem的属性

Posted

技术标签:

【中文标题】ComboBox MultiBinding如何绑定到SelectedItem的属性【英文标题】:How does ComboBox MultiBinding bind to SelectedItem's property 【发布时间】:2021-02-15 17:14:39 【问题描述】:

我将 MultiBinding 用于 ComboBox。我要绑定的参数之一是SelectedItem's SelectedName。这里SelectedNamestring 类型。

如果不是 MultiBinding,我有这个效果很好:

<ComboBox Background="Binding SelectedItem.SelectedName, 
        RelativeSource=RelativeSource Self, Converter=StaticResource MyConverter">

但是在 MultiBinding 中,当我尝试绑定到 SelectedItem.SelectedName 时,它会报告

无法将“MS.Internal.NamedObject”类型的对象转换为类型 'System.String'。

这是我的代码:

<ComboBox.Background>
    <MultiBinding Converter="StaticResource MyMultiBindingConverter">
        <Binding .../>
        <Binding RelativeSource="RelativeSource Self" Path="SelectedItem.SelectedName"/> //this line fails
    </MultiBinding>
</ComboBox.Background>

我怎样才能使它正确?谢谢。

更新信息:

ComboBox 没有默认的SelectedItem。当我使用MyConverter时,如果我没有选择一个项目,Convert方法中的断点将不会被命中。在我选择一个项目后,断点被击中,这是我想要的行为。

但是,当我使用MyMultiBindingConverter 时,情况完全相反 - 断点将在 UI 加载时被命中,而在我选择一个项目后不会被命中。

【问题讨论】:

这能回答你的问题吗? Unable to cast object of type 'MS.Internal.NamedObject' to BitmapImage 我相信MultiBinding 标记中的上下文不是您所期望的。 Relative Source Self 不会解析为 ComboBox 对象。您可能应该改用RelativeAncestor。请参阅建议的副本。 你好@Peter Duniho。我修改为&lt;Binding RelativeSource="RelativeSource AncestorType=ComboBox" Path="SelectedItem.SelectedName"/&gt;,还是一样的错误,我应该把DataContext放在某个地方吗? 似乎Relative Source Self 没问题 - 与“SingleBinding”的唯一区别是Convert 方法中的断点将在 UI 加载时被命中(虽然我不知道是什么导致了这种差异) .我修改转换器后,它工作正常。 【参考方案1】:

你应该检查你的Convert方法中是否有string

public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)

    if (values.Length < 2)
        return Binding.DoNothing;

    string selectedName = values[1] as string;
    if (string.IsNullOrEmpty(selectedName))
        return Binding.DoNothing;:

    //...

您不能假定每次调用Convert 方法时SelectedItem.SelectedName 属性都会返回一个值。

【讨论】:

以上是关于ComboBox MultiBinding如何绑定到SelectedItem的属性的主要内容,如果未能解决你的问题,请参考以下文章

WPF 多值绑定(MultiBinding)与多属性触发器(MultiTrigger)与多数据触发器(MultiDataTrigger)

06.Binding(绑定)03

c# comboBox控件绑定表字段问题。如何同时绑定多个comboBox呢,使其下拉列表的内容都是一样的 见详细补充

如何通过 ObjectDataProvider 将 ComboBox 绑定到通用字典

如何根据已更改的绑定 dataProvider 内容调整 Flex 3 ComboBox 宽度?

如何将通用项目添加到绑定到 WPF 中的集合的 ComboBox