我是WPF的新手。我创建了一个WPF项目,并添加了以下类
public class MessageList:INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
private List<string> list = new List<string>();
public List<string> MsgList
{
get { return list; }
set
{
list = value;
OnPropertyChanged("MsgList");
}
}
public void AddItem(string item)
{
this.MsgList.Add(item);
OnPropertyChanged("MsgList");
}
}
然后在主窗口中我添加了一个ListBox,下面是xaml内容
<Window.DataContext>
<ObjectDataProvider x:Name="dataSource" ObjectType="{x:Type src:MessageList}"/>
</Window.DataContext>
<Grid>
<Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="52,44,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
<ListBox Height="233" IsSynchronizedWithCurrentItem="True" HorizontalAlignment="Left" Margin="185,44,0,0" Name="listBox1" VerticalAlignment="Top" Width="260" ItemsSource="{Binding Path=MsgList}" />
</Grid>
以下是MainWindow.cs的源代码
public partial class MainWindow : Window
{
private MessageList mlist = null;
public MainWindow()
{
InitializeComponent();
object obj = this.DataContext;
if (obj is ObjectDataProvider)
{
this.mlist = ((ObjectDataProvider)obj).ObjectInstance as MessageList;
}
}
private void button1_Click(object sender, RoutedEventArgs e)
{
this.mlist.AddItem(DateTime.Now.ToString());
}
}
我的问题是在点击按钮后,列表框上没有显示任何内容,原因是什么?
答案 0 :(得分:6)
您应该使用ObservableCollection代替List
来通知UI收集更改。
答案 1 :(得分:4)
你问了一个理由,而devdigital给了你解决方案,值得一提的是它为什么不起作用,以及为什么他的修复有效:
你的mlist绑定到ListBox,它的运行状况良好。现在,您按下按钮,然后在列表中添加一个条目。列表框只是不知道这个变化,因为你的列表无法告诉“嘿,我刚刚添加了一个新项目”。为此,您需要使用实现INotifyCollectionChanged的Collection,如ObservableCollection。这与您的OnPropertyChanged
非常相似,如果您修改MessageList上的属性,它也会调用触发PropertyChanged
事件的OnPropertychanged方法。数据绑定注册到PropertyChanged
事件,现在知道您何时更新属性并自动更新UI。如果您希望在集合上自动更新UI,则集合也是必需的。
答案 2 :(得分:2)
罪魁祸首是string
项目... string
项目是原始类型,当您执行OnPropertyChanged
使用observable collection或在button1_Click()函数中调用它......
listBox1.Items.Refresh();