2009-04-27 55 views
2

性質有什麼辦法,如何強制的ObservableCollection火CollectionChanged?我有一個對象的ObservableCollection ListBox項目源,所以每次我添加/刪除項目集合,ListBox相應地改變,但是當我更改集合中的某些對象的屬性時,ListBox仍呈現舊值。如何強制列表框重新加載的ListBoxItems

即使我做了一些修改屬性,然後添加/刪除對象的集合,什麼也沒有發生,我仍然看到舊值。

有沒有解決任何其他方式做到這一點?我發現界面INotifyPropertyChanged,但我不知道如何使用它。在您的收藏中的項目

回答

4

我同意馬特的上述評論。這裏有一小段代碼來展示如何實現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

哇,很好的例子,這正是我需要的:) – 2009-04-27 10:08:29

1

修改屬性將不火NotifyCollectionChanged集合本身 - 它並沒有改變集合,畢竟。

你是正確的軌道上INotifyPropertyChanged的。您需要在列表中包含的類上實現該接口。因此,如果您的收藏是ObservableCollection<Foo>,請確保您的Foo類實現INotifyPropertyChanged。

相關問題