这个问题非常简单,但每次我在这里看到类似的问题时,答案都没有用一个简单的例子来解释一个方法。这是我的代码:
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;但他们并没有向你展示像我一样的轻松的方式。
提前感谢您的帮助
答案 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工具包来简化一些事情。希望这会有所帮助。