WPF ComboBox绑定ItemsSource
我是WPF的初学者,并试图将ComboBox的Items绑定到ObservableCollection
我用过这段代码:
XAML
C#
public MainWindow() { cmbTest.ItemsSource = cmbContent; cmbContent.Add("test 1"); cmbContent.Add("test 2"); InitializeComponent(); } public ObservableCollection cmbContent { get; set; }
在我尝试调试之前,我没有在此代码上出现任何错误,它会抛出错误:
TargetInvocationError
PresentationFramework.dll中出现未处理的“System.Reflection.TargetInvocationException”类型exception
谁能告诉我我做错了什么?
您当前的实施有一些问题。 正如其他人所说,您的列表当前为NULL
,并且未设置Window的DataContext
。
虽然,我建议(特别是因为你刚开始使用WPF)正在学习使用MVVM
以更“正确”的方式进行绑定。
请参阅下面的简化示例:
首先,您要设置Window
的DataContext
。 这将允许XAML
“查看” ViewModel
的属性。
/// /// Interaction logic for MainWindow.xaml /// public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); DataContext = new ViewModel(); } }
接下来,只需设置一个ViewModel
类,它将包含所有Window's
绑定元素,例如:
public class ViewModel { public ObservableCollection CmbContent { get; private set; } public ViewModel() { CmbContent = new ObservableCollection { "test 1", "test 2" }; } }
最后,更新您的XAML
以便绑定路径与集合匹配:
public MainWindow() { InitializeComponent(); cmbContent=new ObservableCollection(); cmbContent.Add("test 1"); cmbContent.Add("test 2"); cmbTest.ItemsSource = cmbContent; } public ObservableCollection cmbContent { get; set; }
上面的代码不使用任何绑定,这意味着使用它不需要绑定Combobox's
ItemSource
,如果你不想使用绑定你需要
第一步 :使用以下命令从CodeBehind(ViewModel)设置DataContext:
this.DataContext=this;
或者来自Xaml:
DataContext="{Binding RelativeSource={RelativeSource Self}}">
第二 :在ItemSource中使用Binding就像你使用ItemsSource="{Binding Path=cmbContent}"
,如果你想在属性发生任何变化时通知UI,你也可以考虑使用INotifyPropertyChanged
接口。
cmbContent
为null,因为您从未将其设置为任何内容。 我猜这个错误实际上是一个NullReferenceException
,但是它显示为TargetInvocationException
因为它位于视图的构造函数中。
此外,您将两次设置ComboBox
的ItemsSource
(一次在绑定中,一次在构造函数中)。 你不需要这样做。 选一个。 您的绑定将无法DataContext
编写方式工作(因为未设置DataContext
),因此您应该在代码中执行此操作,或者设置DataContext
(如Nadia所建议)。