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
。这里SelectedName
是string
类型。
如果不是 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。我修改为<Binding RelativeSource="RelativeSource AncestorType=ComboBox" Path="SelectedItem.SelectedName"/>
,还是一样的错误,我应该把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)
c# comboBox控件绑定表字段问题。如何同时绑定多个comboBox呢,使其下拉列表的内容都是一样的 见详细补充
如何通过 ObjectDataProvider 将 ComboBox 绑定到通用字典