2009-03-12 7 views
2

개체 컬렉션에 데이터 바인딩되는 목록 상자가 있습니다. 프로그램에서이 개체 중 어느 개체가 START 개체인지 사용자에게 표시하기 위해 항목이 표시되는 방식을 수정하려고합니다.INotifyPropertyChanged를 사용하여 목록 상자 항목을 업데이트하는 방법

다음과 같은 방법을 시도했지만 목록 상자가 자동으로 업데이트되지 않습니다. 컨트롤을 무효화해도 작동하지 않았습니다.

내가 찾을 수있는 유일한 방법은 데이터 바인딩을 완전히 제거하고 다시 추가하는 것입니다. 하지만 제 경우에는 바람직하지 않습니다.

다른 방법이 있습니까?

class Person : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private string _name; 
    public string Name 
    { 
     get 
     { 
      if (PersonManager.Instance.StartPerson == this) 
       return _name + " (Start)";      
      return _name; 
     } 
     set 
     { 
      _name = value; 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs("Name")); 
     } 
    } 

    public Person(string name) 
    { 
     Name = name; 
    } 
} 

클래스 느릅 나무는 내가 그 확신 목록과 나는 다음과 같은 코드

private void button1_Click(object sender, EventArgs e) 
    { 
     PersonManager.Instance.StartPerson = (Person)listBox1.SelectedItem; 
    } 

답변

2

를 사용하는 형태로 시작

class PersonManager 
{ 
    public BindingList<Person> persons { get; set; } 
    public Person StartPerson { get; set; } 

    private static PersonManager _instance; 
    public static PersonManager Instance 
    { 
     get 
     { 
      if (_instance == null) 
      { 
       _instance = new PersonManager(); 
      } 
      return _instance; 
     } 
    } 

    private PersonManager() 
    { 
     persons = new BindingList<Person>(); 
    } 
} 

에게있는 항목을 관리입니다 문제는이 작업을 수행 할 때 Person.Name 속성을 "get"접근 자로 만들고 값을 변경하는 것입니다 (UI가 관련된 한 set accessor와 같이 작동).

그러나 바인딩이 업데이트되고 있음을 알리는 것은 없습니다. start를 설정할 때 PropertyChanged가 호출되면, 이것이 업데이트 될 것이라고 생각합니다. (:이 테스트를하지 않았다, 그래서 ~ ~ 문제가있을 수 있습니다 참고) :

은 투박하지만 당신이 쓴 방법은, 당신이 추가하고 작동 할 수 있으리라 생각

private void button1_Click(object sender, EventArgs e) 
{ 
    Person newStart = (Person)listBox1.SelectedItem; 
    if (newStart != null) 
    { 
     PersonManager.Instance.StartPerson = newStart; 
     newStart.Name = newStart.Name; // Dumb, but forces a PropertyChanged event so the binding updates 
    } 
} 
+0

매력처럼 작동하는 신속한 응답에 대해 감사드립니다. –

+0

그냥 호기심이 생길 것입니다. 처음부터이 코드를 코딩하면 어떻게이 문제를 해결할 수 있습니까? –

+0

잠재적으로 더 깨끗한 방법은 Name + DisplayName 속성과 같은 것을 사용하는 것일 수 있습니다. 또는 사람이 "시작"사람인지 여부를 결정하는 속성이있는 경우 설정하면 이벤트가 발생합니다. 많은 옵션이 있습니다. 실제로 사용 방법에 달려 있습니다. –

관련 문제