WPF ComboBox绑定ItemsSource

时间:2015-02-06 19:51:24

标签: c# wpf xaml binding combobox

我是WPF的初学者并尝试将ComboBox的Items绑定到ObservableCollection

我使用了这段代码:

XAML

<Window x:Class="comboBinding2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        DataContext="{Binding RelativeSource={RelativeSource Self}}"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <ComboBox x:Name="cmbTest" ItemsSource="{Binding Path=cmbContent}" Width="200" VerticalAlignment="Center" HorizontalAlignment="Center" />
    </Grid>
</Window>

C#

public MainWindow()
{
    cmbTest.ItemsSource = cmbContent;
    cmbContent.Add("test 1");
    cmbContent.Add("test 2");

    InitializeComponent();
}

public ObservableCollection<string> cmbContent { get; set; }

在我尝试调试之前,我没有在此代码中出现任何错误,它会抛出错误:

TargetInvocationError

未处理的类型&#39; System.Reflection.TargetInvocationException&#39;发生在PresentationFramework.dll

有谁能告诉我我做错了什么?

3 个答案:

答案 0 :(得分:10)

您当前的实施存在一些问题。正如其他人所说,您的列表目前为NULL,并且未设置窗口的DataContext

尽管如此,我建议(特别是因为你刚开始使用WPF)正在学习使用MVVM以更“正确”的方式进行绑定。

请参阅下面的简化示例:

首先,您要设置DataContext的{​​{1}}。这样,Window就可以“查看”XAML中的属性。

ViewModel

接下来,只需设置一个/// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); DataContext = new ViewModel(); } } 类,其中包含所有ViewModel绑定元素,例如:

Window's

最后,更新您的public class ViewModel { public ObservableCollection<string> CmbContent { get; private set; } public ViewModel() { CmbContent = new ObservableCollection<string> { "test 1", "test 2" }; } } ,以便绑定路径与集合匹配:

XAML

答案 1 :(得分:2)

   public MainWindow()
    {

        InitializeComponent();
        cmbContent=new ObservableCollection<string>();
        cmbContent.Add("test 1");
        cmbContent.Add("test 2");
        cmbTest.ItemsSource = cmbContent;

    }
    public ObservableCollection<string> cmbContent { get; set; }

上面的代码不使用任何绑定,这意味着使用它不需要绑定Combobox's ItemSource,如果你不想使用你需要的绑定

首先:使用以下命令从CodeBehind(ViewModel)设置DataContext:

this.DataContext=this;

或来自Xaml:

DataContext="{Binding RelativeSource={RelativeSource Self}}">

第二次:在ItemSource中使用Binding就像您ItemsSource="{Binding Path=cmbContent}"一样,如果您想要在发生任何更改时通知用户界面,您也可以考虑使用INotifyPropertyChanged接口在一个属性

答案 2 :(得分:1)

cmbContent为null,因为您从未将其设置为任何内容。我猜测错误实际上是NullReferenceException,但它显示为TargetInvocationException,因为它位于视图的构造函数中。

此外,您需要设置ItemsSource ComboBox两次(一次在绑定中,一次在构造函数中)。你不需要这样做。选一个。您的绑定不会按照其编写方式工作(因为DataContext未设置),因此您应该在代码中执行此操作,或者设置DataContext(如纳迪亚建议。)