2016-02-19 52 views
-3

問題很簡單,但每次我在這裏看到類似的問題時,答案都沒有解釋一種簡單的方法。這裏是我的代碼:將列表框綁定到列表中的簡單方法<string>在wpf中,安全更新

XAML:

<ListBox Name="ListBox_PuntosIntermedios" MaxHeight="80" Height="80" ScrollViewer.VerticalScrollBarVisibility="Auto"> 
      </ListBox> 

,就是這樣的項目清單:

List<string> Lista_punto_intermedio = new List<string>(); 

所有我在WPF窗口的加載方法做了,是這樣的:

Lista_punto_intermedio.Add("testing..."); 
ListBox_PuntosIntermedios.ItemsSource = Lista_punto_intermedio; 

它正確顯示項目「testing ...」,但是當我在列表中添加一個新項目時,它不會顯示在列表框中。我如何糾正我的代碼,以顯示項目,而不使用ListBox_PuntosIntermedios.Items.Refresh();有時會給我錯誤,甚至不會被調試器顯示出來。

我見過其他的答案,說「使用inotify ...」,「使用mvvm ...」,但他們沒有告訴你一個簡單的方法來做像我這樣的noobs。

在此先感謝您的幫助

+0

做快速在下面的谷歌搜索有很多的例子有 'C#stackoverflow綁定列表框與列表' – MethodMan

+0

做到了這一點,但這些例子對我來說還不夠清楚。 –

+0

這些例子非常簡單,甚至不好笑 – MethodMan

回答

0

在你的例子做的最簡單的辦法是使用ObservableCollection<string>(在System.Collections.ObjectModel命名空間),而不是一個列表。 ObservableCollection <>會在項目添加/刪除到集合時通知您的列表框,並且您的UI將通過WPF數據綁定的魔術更新。當你的用戶界面在集合更改時會更新(新項目將出現在列表框中,並且刪除的項目將從列表框中刪除),這會讓你獲得一半的位置。

ObservableCollection<string> Lista_punto_intermedio = new ObservableCollection<string>(); 

然後,你可能希望你的列表框更新時的一個字符串隨之改變(例如:如果「測試......」被更新爲「工作...」,你可能希望你的列表框中顯示「正在......」)。爲了使用WPF數據綁定,您需要在ObservableCollection中的對象上實現IPropertyNotifyChanged。爲此,您可以爲文本引入一個帶有字符串屬性的新類。也許是這樣的:

public class MyNotifyableText : INotifyPropertyChanged 
{ 
    private string _myText; 
    public string MyText { 
     get { return this._myText; } 
     set 
     { 
      if(this._myText!= value) 
      { 
        this._myText= value; 
        this.NotifyPropertyChanged("MyText"); 
      } 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    public void NotifyPropertyChanged(string propName) 
    { 
     if(this.PropertyChanged != null) 
      this.PropertyChanged(this, new PropertyChangedEventArgs(propName)); 
    } 
} 

當「MYTEXT」屬性改變,這將使你的列表框進行相應的更新此對象將發送通知到WPF數據綁定。爲了配合這一新的對象和你的列表框在一起,你將不得不改變你的XAML因此列表框會顯示您的「MYTEXT」屬性,改變ObservableCollection<string>ObservableCollection<MyNotifyableText>

這裏有一個最終的代碼示例:

XAML(注該屬性的DisplayMemberPath):

<ListBox Name="ListBox_PuntosIntermedios" DisplayMemberPath="MyText" MaxHeight="80" Height="80" ScrollViewer.VerticalScrollBarVisibility="Auto" > 
      </ListBox> 

項目清單:

ObservableCollection<MyNotifyableText> Lista_punto_intermedio = new ObservableCollection<MyNotifyableText>(); 

負載:

Lista_punto_intermedio.Add(new MyNotifyableText(){ MyText="testing..." }); 
ListBox_PuntosIntermedios.ItemsSource = Lista_punto_intermedio; 

最後,我發現這個教程有幫助的學習WPF數據綁定:http://www.wpf-tutorial.com/data-binding/responding-to-changes/

+0

你無法更好地解釋它,並且指出,非常感謝!你讓我的一天:) –

+0

沒問題,朱利安。國際海事組織,WPF有一個陡峭的學習曲線,但完全值得所需的時間/努力/耐心。祝你好運! –

-1

我創建了一個非常簡單的樣品溶液here.

如果您正在使用WPF開發,也希望用2綁定,你最好的選擇是MVVM。有一條學習曲線,但它是值得的。

在示例中,我使用了MVVMLight工具包來簡化幾件事情。希望這可以幫助。

+0

非常感謝您的回答,我從中學到了一些技巧。祝你今天愉快。 –

相關問題