Почему ListBox не отображает связанный ItemsSource - PullRequest
2 голосов
/ 16 февраля 2012

Я новичок в 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 ]

6 голосов
/ 16 февраля 2012

Вы должны использовать ObservableCollection вместо List для уведомления пользовательского интерфейса об изменениях коллекции.

4 голосов
/ 16 февраля 2012

Вы спросили причину, в то время как devdigital дал вам решение, стоит упомянуть, почему оно не работает и почему его исправление работает:

Ваш mlist связан с ListBox, и все работает хорошо. Теперь вы нажимаете кнопку и добавляете запись в свой список. Окно списка просто не будет знать об этом изменении, потому что в вашем списке нет способа сказать «Эй, я только что добавил новый элемент». Для этого вам необходимо использовать коллекцию, реализующую INotifyCollectionChanged , например ObservableCollection. Это очень похоже на ваш OnPropertyChanged, если вы изменяете свойство в своем MessageList, он также вызывает метод OnPropertychanged, который вызывает событие PropertyChanged. Привязка данных регистрируется в событии PropertyChanged и теперь знает, когда вы обновили свое свойство, и автоматически обновляет пользовательский интерфейс. То же самое необходимо для Коллекций, если вы хотите автоматическое обновление пользовательского интерфейса для коллекций.

2 голосов
/ 16 февраля 2012

Преступник - это string элементы ... string элементы, имеющие примитивный тип, не обновляйте привязки в списке при выполнении OnPropertyChanged

Либо используйте наблюдаемую коллекцию, либо вызовите ее в функции button1_Click () ...

  listBox1.Items.Refresh();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...