2017-08-03 59 views
0

一個學生需要一點幫助:XAML列表框綁定列表形成另一個的.cs

我在主窗口中有一個列表,並希望將其綁定到我的用戶列表框。

我的主窗口代碼列表:

public List<T> test_list; 
    public MainWindow() 
    { 
     InitializeComponent(); 
     test_list= new List<T>(); //creating the list 
     test_list_fill(); // filling the list with some stuff 
    } 

在適當的事實,test_list是未知的,這是沒有什麼特別的用戶控件的.cs這是不可能使用Listbox1.ItemsSource = test_list;。 我的問題是有另一種方法來獲得testbox列表中填充Listbox1?

我嘗試了一些XAML的東西,但我不會得到它的工作。

<ListBox x:Name="Listbox1" 
     ItemsSource="{Binding Source=test_list}" 
     Margin="17,130,17,118" > 

這至少在列表框中顯示「test_list」,但那不是我列表的內容。我知道我後來需要像<TextBlock Text="{Binding name}"這樣的內容來顯示內容,但我甚至不會獲得綁定。 UserControl.cs中沒有Listbox1.ItemsSource = test_list;的解決方案嗎?

在此先感謝,並有一個愉快的一天打字一些代碼!

回答

0

讓它成爲一個屬性。綁定不適用於字段。

public List<T> test_list {get;set;} 

和,此外,你應該提供你想要的,而不是在TList<T>什麼List<string>類型,List<int>List<Customer>

更新:這裏有一些其他的細節: - 你把這個列表在代碼後面的文件中。綁定是通過控件的DataContext屬性中的對象完成的,並且這通常是另一個類(稱爲ViewModel),與Window不同。 - 如果您在之後創建了名單InitializeComponent()被調用,那麼它將不會被加載,因爲綁定已經完成並且沒有列表(尚未)。爲了檢測財產的變化,實施INotifyPropertyChanged界面(網上有很多例子)。 - 如果稍後要更改列表中的項目並希望在UI中反映該項目,請使用ObservableCollection<T>而不是List<T>,並且它會在添加或刪除某個元素時通知。

所以,完整的解決方案是: - 創建單獨的類,將有物業test_list - 製作它實現INotifyPropertyChanged,並從它的屬性 的二傳手提高事件 - 如果你將添加/刪除元素,使用ObservableCollection而不是List。 - 將此類的實例設置爲WindowDataContext屬性。

+0

完成。現在在Listbox上有一個滾動條,但仍然沒有價值。我是否需要用'ItemsSource =「{Binding Source = test_list}」''來更改某些內容?這樣就有一個很大的白色光束,我可以用'ItemsSource =「{Binding test_list}」'沒有任何東西。 – Knoggino

+0

我更新了答案和一些額外的細節。這是更完整和詳細的解決方案。如果卡住了,請告訴我:)另外,請查看在線MVVM模式。 – Shadowed

0

創建您UserControl.cs屬性,這將是ItemSource您在用戶控制ListBox。 在UserControl.cs

private ObservableCollection<string> _firstNames = new ObservableCollection<string>(); 
    public ObservableCollection<string> FirstNames { get { return _firstNames; } } 

    public void PopulateNames(IEnumerable<string> names) 
    { 
     foreach (string name in names) 
     { 
      _firstNames.Add(name); 
     } 
    } 

在你的用戶控件。XAML:現在

<ListBox x:Name="listBox" ItemsSource="{Binding FirstNames}"/> 

,從父類的構造:

var names = new List<string>() {"James", "bond"}; 
myusercontrol.PopulateNames(names); 

一個List的相反,你會想用ObservableCollection,因爲它內置了一個變化通知機制。因此,一旦設定了。 BindingxamlObservableCollection,它將反映在UI中,而不必執行其他代碼。另請注意,在使用ObservableCollection時,如果要更改以反映UI,則不應該使用new,而應該修改您最初創建的那個。

但這並不是理想的方法,您應該在進一步深入研究時考慮MVVM模式。這應該解決你所要求的。