为什么ListBox不显示绑定的ItemsSource

时间:2012-02-16 09:43:45

标签: wpf listbox

我是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());
        }
    }

我的问题是在点击按钮后,列表框上没有显示任何内容,原因是什么?

3 个答案:

答案 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();