2009-04-27 5 views
2

Gibt es eine Möglichkeit, wie ObservableCollection erzwingen CollectionChanged auslösen?Wie erzwingen ListBox zum Neuladen von Eigenschaften von ListBoxItems

Ich habe eine ObservableCollection von Objekten ListBox Element Quelle, also jedes Mal, wenn ich Element zur Sammlung hinzufügen/entfernen, ändert ListBox entsprechend, aber wenn ich Eigenschaften einiger Objekte in der Sammlung ändern, rendert ListBox immer noch die alten Werte.

Auch wenn ich einige Eigenschaften ändern und dann Objekt hinzufügen/entfernen, passiert nichts, ich sehe immer noch alte Werte.

Gibt es einen anderen Weg, dies zu tun? Ich habe die Schnittstelle INotifyPropertyChanged gefunden, aber ich weiß nicht, wie ich sie benutzen soll.

Antwort

4

Ich stimme den Kommentaren von Matt oben zu. Hier ist ein kleiner Codeabschnitt, der zeigt, wie INotifyPropertyChanged implementiert wird.

===========
-Code-behind
===========

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> 

+0

wow, schönes Beispiel, das ist genau das, was ich brauchte :) –

+0

Froh, dass ich helfen könnte :) –

1

Durch das Ändern der Eigenschaften für die Objekte in der Objektgruppe wird NotifyCollectionChanged nicht für die Objektgruppe selbst ausgelöst. Die Objektgruppe wurde nicht geändert.

Sie sind mit INotifyPropertyChanged auf dem richtigen Weg. Sie müssen diese Schnittstelle für die Klasse implementieren, die Ihre Liste enthält. Wenn Ihre Sammlung ObservableCollection<Foo> ist, stellen Sie sicher, dass Ihre Foo-Klasse INotifyPropertyChanged implementiert.

Verwandte Themen