2014-02-21 3 views
1

이것은 중복 질문 일 수 있지만 좋은 답변을 찾을 수 없습니다. Binding WinForms ListBox to object properties과 같은 모든 대답은 내 WinForm에서 작동하지 않습니다. 나는 설명 할 것이다.ListBox.SelectedItem to Property

나는 ListBox에 나와있는 기업 목록을 가지고 있습니다. SelectedItem이 변경되면 내 모델의 속성이 업데이트됩니다. 그래서 나는 Firms 속성을 읽을 수 있습니다.

// the classes 
public class Firm 
{ 
    public string Name { get; set; } 
    public int Id { get; set; } 
    // more properties ... 
} 

public class MyModel : INotifyPropertyChanged 
{ 
    private Firm _firm = new Firm(); 
    public Firm Firm 
    { 
     get { return _firm; } 
     set 
     { 
      if (Equals(value, _firm)) return; 
      _firm = value; 
      OnPropertyChanged(); 
     } 
    } 
    // more properties and OnPropertyChanged() ... 
} 

// the form 
private MyModel Model; 

public void MyForm(List<Firm> firms) 
{ 
    lstFirm.DataBindings.Add("SelectedItem", Model, "Firm", 
     true, DataSourceUpdateMode.OnPropertyChanged); 
    lstFirm.DisplayMember = "Name"; 
    lstFirm.ValueMember = "Id"; 
    lstFirm.DataSource = firms; 
} 

public void lstFirm_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    // Do something with Model.Firm 
} 

문제는 Model.Firm null는 것입니다. 아무도 내가 ListBoxModel 사이에 데이터 바인딩을 만들기 위해해야 ​​할 일이 있는지 알고 있습니까? 내 WinForm (예 : TextBoxes ~ String 속성)에 다른 것들을 바인딩하고 그것들은 훌륭하게 작동합니다.

답변

0

시험 주말이 끝난 후 확인해 보았습니다.

SelectedIndexChanged 이벤트에서 디버깅 중이었고 내 Model.Firm에서 변경 사항을 아직 보지 못했습니다. 그러나 SelectedItemChanged 이벤트는 내부 용이므로 사용할 수 없으며 SelectedItem의 데이터 바인딩을 사용하면 데이터 바인딩 된 항목에 값이 적용됩니다.

이제는 변경이 표시되지 않는 이유는 SelectedIndexChanged이 실행 된 후에 만 ​​SelectedItemChanged이 실행되기 때문입니다.

this.SelectedIndex = value; 
this.SelectedItem = FindItem(value); 
this.SelectedIndexChanged(/*values*/); 
this.SelectedItemChanged(/*values*/); // Apply databinding changes 

그래서는 변경이 발생했습니다 전에 변경 사항을 표시하지 않는 것이 아주 정상입니다 같은 내부 ListBox 제어, 아마 보인다. 그리고 나는 이것을 알지 못했기 때문에 SelectedItem (변경된 값을 표시하고있는 사람)이 databound 모델 속성으로 복사되지 않은 이유가 다소 혼란 스러웠습니다.

그래서 모든 것을 작동시키기 위해 중요한 사항을 변경할 필요가 없었습니다. :)

2

내가 볼 수있는 것부터 코드는 절대로 Model.Firm을 설정하지 않습니다 ... MyModel의 생성자는 어디에 있습니까? 모델을 제공하지 않으면 명시 적으로 설정하지 않으면 Model.Firm은 null 상태를 유지합니다. 여기에 예제 생성자는 다음과 같습니다

public MyModel(Firm firm) 
{ 
    _firm = firm; 
} 

또한, Equals()은 당신이하지 생각하지 않습니다. if (Equals(value, _firm)) return; 대신 다음을 사용하십시오. if (value == _firm) return;

+0

개인 회사 _firm = 새 회사(); – Schuere

+0

내 생성자에 기본 회사를 추가했으며 setters를 수정했습니다. (Resharper의 기본 구현은 Equals 대 비교자를 생각하지 않았습니다.)하지만, 행운은 없습니다. –