2015-02-06 80 views
2

我对WPF初学者,试图将组合框的项目绑定到一个ObservableCollectionWPF组合框结合的ItemsSource

我用这个代码:

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

型“System.Reflection.TargetInvocationException”未处理的异常发生在PresentationFramework.dll

谁能告诉我什么,我做错了什么?套装:

回答

6

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

虽然,我会建议(特别是因为你刚开始使用WPF)正在学习使用MVVM来进行更“正确”的绑定。

请参见下面的简单的例子:

首先,你要设置你的WindowDataContext。这将允许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,这样的结合路径集合匹配:

<Grid> 
    <ComboBox Width="200" 
      VerticalAlignment="Center" 
      HorizontalAlignment="Center" 
      x:Name="cmbTest" 
      ItemsSource="{Binding CmbContent}" /> 
</Grid> 
+0

这工作正常,但我怎么能从MainWindow添加一个其他字符串到CmbContent? – LUXS 2015-02-06 20:50:58

+0

是否要实时添加字符串,还是让组合框包含其他字符串? – 2015-02-06 21:00:18

+0

我想添加一个字符串实时 – LUXS 2015-02-06 21:07:11

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; } 

上面的代码不使用任何约束力,如果你wan't使用绑定你需要

首先多数民众赞成意味着使用它也没有必要绑定Combobox'sItemSource,使用的DataContext从代码隐藏(视图模型):

this.DataContext=this; 

或XAML中:

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

:使用在的ItemSource绑定就像你,你也可以considere使用INotifyPropertyChanged接口,如果你想通知中的任何改变的情况下的UI在属性

1

cmbContentItemsSource="{Binding Path=cmbContent}"为null,因为你永远不将其设置为任何内容。我猜这个错误实际上是一个NullReferenceException,但它显示为TargetInvocationException,因为它在视图的构造函数中。

另外,您将ComboBoxItemsSource设置为两次(一次在绑定中,一次在构造函数中)。你不需要那样做。选一个。您的绑定不会按照写入的方式工作(因为DataContext未设置),因此您应该使用代码执行此操作,或者设置DataContext(如Nadia所建议的)。