I am new to WPF. I have created a WPF project, and add the following class
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");
}
}
Then in the main window I added a ListBox and below is the xaml content
<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>
Here is the source code of 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());
}
}
My question is after I clicked the button, there isn’t any content displayed on the Listbox, what is the reason?
You asked for a reason, while devdigital gave you the solution its worth mentioning why it is not working, and why his fix works:
Your mlist is bound to the ListBox and its all working well. Now you press the button and you add an entry to your list. The listbox just won’t know about this change, because your list has no way of telling “Hey i just added a new item”. To do that, you need to use a Collection implementing INotifyCollectionChanged, like the ObservableCollection. This is very similar to your
OnPropertyChangedif you modify a property on your MessageList it also calls the OnPropertychanged method which fires thePropertyChangedevent. The Databinding registers to thePropertyChangedevent and now knows when you updated your property and automatically updates the UI. The same is necessary for Collections if you want this automatic updating of the UI on collections.