将列表框绑定到wpf中的列表<string>的简单方法,安全更新

时间:2016-02-19 15:49:11

标签: c# wpf xaml listbox

这个问题非常简单,但每次我在这里看到类似的问题时,答案都没有用一个简单的例子来解释一个方法。这是我的代码:

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;

显示项目&#34;测试......&#34;正确,但是当我在列表中添加新项目时,它不会显示在列表框中。如何在不使用ListBox_PuntosIntermedios.Items.Refresh()的情况下更正我的代码以显示项目;这有时会给我一些调试器甚至无法显示的错误。

我已经看到了其他答案,说&#34;使用inotify ......&#34; &#34;使用mvvm ...&#34;但他们并没有向你展示像我一样的轻松的方式。

提前感谢您的帮助

2 个答案:

答案 0 :(得分:0)

在您的示例中,最简单的方法是使用ObservableCollection<string>(在System.Collections.ObjectModel命名空间中)而不是List。的ObservableCollection&LT;&GT;将项目添加/删除到集合时将通知您的ListBox,您的UI将通过WPF数据绑定的魔力进行更新。这会让你到达那里,因为你的UI会在集合发生变化时更新(新项目将出现在ListBox中,被删除的项目将从ListBox中删除)。

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

然后,您可能希望ListBox在其中一个字符串更改时更新(例如:if&#34; testing ...&#34;已更新为&#34;正在运行...&#34 ;,您可能希望ListBox显示&#34;工作......&#34;)。为了使用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));
   }
}

当&#34; MyText&#34;该对象将向WPF数据绑定发送通知。属性已更改,这将允许您的ListBox相应更新。要将这个新对象和ListBox绑定在一起,您将不得不更改您的XAML,以便ListBox显示您的&#34; MyText&#34;属性并将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/

答案 1 :(得分:-1)

我创建了一个非常简单的示例解决方案here.

如果您正在使用WPF进行开发并且还想使用双向绑定,那么最好的选择是MVVM。有一个学习曲线,但它是值得的。

在示例中,我使用了MVVMLight工具包来简化一些事情。希望这会有所帮助。