2015-02-06 83 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所建議的)。