2015-08-23 73 views
0

這有點奇怪,因爲我在那裏找到的每個示例都說我正在做的事情是正確的,但我無法讓我的ComboBox綁定在WPF中工作。綁定組合框ItemsSource不能在WPF中工作

我剛剛創建了一個空的WPF應用程序。

public List<string> myCollection { get; set; } 

    public MainWindow() 
    { 
     DataContext = this; 
     InitializeComponent(); 
     myCollection = new List<string> {"test1", "test2", "test3", "test4"}; 
    } 

這裏是我的XAML是:

<Window x:Class="WpfApplication2.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <ComboBox ItemsSource="{Binding Path=myCollection}" Height="23" HorizontalAlignment="Left" Margin="66,56,0,0" Name="comboBox1" VerticalAlignment="Top" Width="319" /> 
</Grid> 

我試圖綁定MyCollection的,綁定路徑= MyCollection的,我也有和沒有設置DataContext的嘗試。 似乎沒有任何工作。

我已經用完了想法和每一個我發現的例子都說這是正確的方式,它應該工作,所以謝謝你提供的任何幫助。

回答

1

在構造函數的末尾設置的DataContext後InitializeComponent

InitializeComponent();   
myCollection = new List<string> { "test1", "test2", "test3", "test4" }; 
DataContext = this; 
1

comboBox1.ItemsSource = myCollection; 
+0

是的,我知道我能做到這一點的變化,這工作我只是想使這個使用綁定 – RobertPorter

+0

@RobertPorter那麼你應該設置的DataContext如上建議! –

0

Sajeetheran答案工作,因爲XAML對象的初始化着眼於當前狀態,並結合還有什麼當時,但如果將屬性更改爲其他值,則會失敗。我會說,一次變通

我只是想使這個使用綁定

對於大多數WPF方案之一想使用INotifyPropertyChange mechanision允許動態變化通過XAML綁定來處理。如果想真正使用綁定的力量它與INotifyPropertyChange攜手共存。否則,迪米特里的答案和薩耶塔哈蘭的答案一樣有效。


綁定不知道的變化,因爲myCollection參考不通知狀態變化的世界;因此數據不會顯示。

爲了便於通知,用於保存該房產的類需要遵守INotifyPropertyChanged,並且房產myCollection需要發送通知事件。 (注意在你的情況下它的主窗口在技術上是可行的,但是在MVVM範例中,人們希望與dat分離視圖,並且使用類來保存實際數據並提供此通知)。

public MainWindow : INotifyPropertyChanged 

然後提供將被約束性指標被訂閱到該項目上DataContext事件:

public event PropertyChangedEventHandler PropertyChanged; 

則所述機制提供更改事件。

/// <summary> 
/// Raises the PropertyChanged event. 
/// </summary> 
/// <param name="propertyName">The name of the property that has changed.</param> 
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = "") 
{ 
    PropertyChangedEventHandler handler = PropertyChanged; 
    if (handler != null) 
    { 
     handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

然後提供myCollection

private List<string> _myCollection; 

public List<string> myCollection 
{ 
    get { return _myCollection; } 
    set { _myCollection= value; OnPropertyChanged("myCollection"); } 
}