2009-04-27 3 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를 구현하는지 확인하십시오.

관련 문제