将集合绑定到WPF ComboBox并选择其中一项

9

我已经花了一段时间在这个问题上苦苦思索。我不太确定为什么它不能工作。我对WPF的业务还很陌生。

这是我的组合框XAML代码:

<ComboBox 
    SelectedValuePath="Type.FullName"
    SelectedItem="{Binding Path=Type}"
    Name="cmoBox" />

以下是ComboBox的选项内容(myAssembly是我创建的一个包含可能类型列表的类)。
cmoBox.ItemsSource = myAssembly.PossibleTypes;

我在代码中的ComboBox的父元素中设置了DataContext,如下所示:

groupBox.DataContext = listBox.SelectedItem;

我希望绑定能够从组合框中选择正确的“可能类型”,但它没有选择任何东西。我尝试过使用SelectedValue和SelectedItem,当我将ComboBox的DisplayMemberPath更改为不同的属性时,它会更改所显示的内容,因此我知道它并非完全损坏。
有什么想法吗?
3个回答

12

你也可以在XAML中设置绑定,而不是在代码后置文件中设置(我们尽可能避免在XAML页面中使用代码后置)。我假设myAssembly是控件的代码后置属性,并且是您的MyAssembly类的一个实例...

<UserControl 
  x:Class="MyNamespace.MyControl"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  DataContext="{Binding}">

  <ComboBox 
    Width="200" 
    ItemsSource="{Binding Path=myAssembly.PossibleTypes}"
    SelectedValuePath="Type.FullName"  
    SelectedItem="{Binding Path=Type}" 
    Name="cmoBox" />
</UserControl>

可能只是个人偏好,但我认为将数据绑定放在XAML中是更好的实践,因为这样可以更容易地查看每个控件绑定到了什么,而不必深入代码背后。此外,如果你想从代码中引用你的ComboBox,你应该在XAML中为它分配一个x:Name属性,而不仅仅是Name。


11
在XAML中,设置ItemsSource="{Binding}",并且在代码背后设置DataContextmyAssembly.PossibleTypes

我没有测试过它...但最近我一直在深入研究WPF(因为在工作中使用它)...我认为这要么是100%正确,要么就是完全错误。 - Timothy Khouri

-5

我同意:绑定应该在XAML中。我从不在代码后面放置...检查...任何东西。数据源都是可重用的“资源”。

(好吧,代码后台构造函数调用InitializeComponent())。


2
你根本没有回答这个问题。你只是加入了你不相关的偏好,不使用代码后台。此外,在你“回答”发布之前18个月,这个问题已经被正确回答了。因为这些原因,我给你打负分。 - Sheridan

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