Как заставить ListBox перезагрузить свойства ListBoxItems - PullRequest
2 голосов
/ 27 апреля 2009

Есть ли способ заставить ObservableCollection запустить CollectionChanged?

У меня есть ObservableCollection объектов ListBox источника элемента, поэтому каждый раз, когда я добавляю / удаляю элемент в коллекцию, ListBox изменяется соответственно, но когда я изменяю свойства некоторых объектов в коллекции, ListBox по-прежнему отображает старые значения. *

Даже если я изменю некоторые свойства, а затем добавлю / уберу объект в коллекцию, ничего не произойдет, я все еще вижу старые значения.

Есть ли другой способ сделать это? Я нашел интерфейс INotifyPropertyChanged, но я не знаю, как его использовать.

Ответы [ 2 ]

4 голосов
/ 27 апреля 2009

Я согласен с комментариями Мэтта выше. Вот небольшой фрагмент кода, чтобы показать, как реализовать INotifyPropertyChanged.

===========
Кодовый код
===========

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Data;
using System.Windows.Documents;

namespace WpfApplication1
{   
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        Nicknames names;

        public Window1()
        {
            InitializeComponent();
            this.addButton.Click += addButton_Click;
            this.names = new Nicknames();
            dockPanel.DataContext = this.names;
        }

        void addButton_Click(object sender, RoutedEventArgs e)
        {
            this.names.Add(new Nickname(myName.Text, myNick.Text));
        }
}
public class Nicknames : System.Collections.ObjectModel.ObservableCollection<Nickname> { }

public class Nickname : System.ComponentModel.INotifyPropertyChanged
{
    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
    void Notify(string propName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propName));
        }
    }

    string name;
    public string Name
    {
        get { return name; }
        set
        {
            name = value;
            Notify("Name");
        }
    }
    string nick;
    public string Nick
    {
        get { return nick; }
        set
        {
            nick = value;
            Notify("Nick");
        }
    }
    public Nickname() : this("name", "nick") { }
    public Nickname(string name, string nick)
    {
        this.name = name;
        this.nick = nick;
    }

    public override string ToString()
    {
        return Name.ToString() + " " + Nick.ToString();
    }
  }
}

XAML

<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Grid>
    <DockPanel x:Name="dockPanel">
        <TextBlock DockPanel.Dock="Top">
        <TextBlock VerticalAlignment="Center">Name: </TextBlock>
        <TextBox Text="{Binding Path=Name}" Name="myName" />
        <TextBlock VerticalAlignment="Center">Nick: </TextBlock>
        <TextBox Text="{Binding Path=Nick}" Name="myNick" />
        </TextBlock>
        <Button DockPanel.Dock="Bottom" x:Name="addButton">Add</Button>
        <ListBox ItemsSource="{Binding}" IsSynchronizedWithCurrentItem="True" />
    </DockPanel>
</Grid>

1 голос
/ 27 апреля 2009

Изменение свойств элементов в вашей коллекции не вызовет NotifyCollectionChanged для самой коллекции - в конце концов, она не изменила коллекцию.

Вы на правильном пути с INotifyPropertyChanged. Вам нужно будет реализовать этот интерфейс в классе, который содержится в вашем списке. Поэтому, если ваша коллекция ObservableCollection<Foo>, убедитесь, что ваш класс Foo реализует INotifyPropertyChanged.

...