将WPF数据绑定ComboBox到List<string>

14

我正在尝试通过 XAML 将我的类型为 List 的属性绑定到 ComboBox,但遇到了困难。

public List<string> MyProperty  { get; set; }
以下 XAML 绑定不起作用:
<ComboBox Name="cboDomainNames" ItemsSource="{Binding Path=MyProperty}"/> 

但是以下赋值语句:

cboDomainNames.ItemsSource = MyProperty;

代码完美运行,但我错过了什么吗?


1
你的 ComboBox 的 DataContext 是否正确? - Rachel
是的,该属性在视图中(我的应用程序是MVP-PRISM-WPF),我已经设置了DataContext = this; 而且更重要的是,ItemSource的代码分配可以工作!但是通过xaml却不行! - ioWint
1
我想我搞定了!我的DataContext被设置了!但是它是在InitializeComponent()之后设置的,我觉得这可能是问题所在。然后我意识到我通过XAML进行绑定!当视图准备好后(即在_presenter.OnViewReady()中)属性被填充!由于它不是可观察集合,所以ComboBox中什么也没有添加!在代码后台中指定它可以工作,因为此时该数据存在于属性中!! - ioWint
@ioWint:请发布一个回答,解释一下问题出在哪里以及你是如何修复它的,并通过答案左侧的勾选标记接受它。 - H.B.
@HB 我在评论中发布了答案!我不确定如何将其标记为答案! - ioWint
请查看此答案:https://dev59.com/62Eh5IYBdhLWcg3w5243#21898127 - Walter Stabosz
3个回答

10

发布我的评论以标记答案。

我的DataContext已设置,但是它是在InitializeComponent()之后设置的。我认为这可能是问题所在。然后我意识到,由于我通过xaml进行绑定,当视图加载时,绑定会发生到一个空属性。

该属性在视图准备好后(即_presenter.OnViewReady()上)得到填充。由于它不是可观察集合,没有任何内容添加到下拉框中。从我的代码后台指定它可以工作,因为此时数据存在于属性中。


7
假设您在窗口/页面中有一个名为FoosList<Foo>,其中Foo具有Name属性。现在您可以按照以下方式在XAML中设置绑定:
<ComboBox ItemsSource="{Binding Path=Foos}"
DisplayMemberPath="Name"
SelectedValuePath="Name"
SelectedValue="{Binding Path=Foo}"
/>

这是基于此SO问题。阅读WPF DataBinding概述作为在WPF中进行数据绑定的良好基础。


1
是的,但目前我对List<string>的一个属性很感兴趣!如果代码后面的ItemsSource赋值没有起作用,那么我就不会更困惑了!我本来会考虑使用自定义实体,认为我总是需要DisplayMemberPath! - ioWint
4
绑定到 List<string> 不是一个解决方案。 - JWP

0

如果您只指定路径而不指定源,则绑定会将容器DataContext作为源。顺便说一下,有用的属性是在容器上定义的(例如窗口)。

您可以按以下方式解决它(在xaml中):

ItemsSource="{Binding Path=MyProperty, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}"

我尝试过这个马里奥(Mario)!但是很不幸!我无法使它填充。视图继承自基础视图,所以我将其放在了我的基础视图上,而不是窗口!它仍然无法绑定! - ioWint

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接