2009-04-27 11 views
2

ObservableCollectionにCollectionChangedを強制的に強制する方法はありますか?ListBoxにListBoxItemsのプロパティをリロードさせる方法

オブジェクトのObservableCollectionを持っていますので、コレクションにアイテムを追加/削除するたびにListBoxが変更されますが、コレクションの一部のオブジェクトのプロパティを変更すると、ListBoxは古い値をレンダリングします。

いくつかのプロパティを変更してオブジェクトをコレクションに追加/削除しても何も起こりませんが、古い値が表示されます。

これを行う方法は他にありますか?インターフェイスINotifyPropertyChangedが見つかりましたが、使用方法はわかりません。

答えて

4

私は上記のMattのコメントに同意します。 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> 

+0

うわー、いい例、それは私が必要としていたものです:) –

+0

うれしい私は助けることができます:) –

1

コレクション内のアイテムのプロパティを変更しても、コレクション自体にNotifyCollectionChangedが発生することはありません。コレクションは変更されません。

あなたは正しいトラックをINotifyPropertyChangedで使用しています。リストに含まれるクラスにそのインターフェースを実装する必要があります。コレクションがObservableCollection<Foo>の場合は、FooクラスがINotifyPropertyChangedを実装していることを確認してください。

関連する問題