2009-09-12 7 views
1

콤보 상자와 관련된 흥미로운 데이터 바인딩 질문이 있습니다. 희망 누군가가 좋은 제안을했습니다.콤보 상자 데이터 바인딩 질문

나는 파일 선택기와 comboxbox를 포함하는 간단한 양식을 가지고 있습니다. 파일을 가져올 때마다 파일에서 List 객체로 문자열 목록을 읽고 comboBox.DataSource = listOfStrings를 설정합니다. 형태 Load 이벤트

, I는 comboBox.DataBindings.Add 세트 ("되어 selectedItem"인 myObject "PickedValue");

목적은 분명하다 : 문자열 콤보 상자에서 선택 될 때마다, 나는 myObject.PickedValue에 문자열을 쓰고 싶어요.

그것은 전체적인 이야기입니다.

이제 파일을 선택하는 대신 양식을 실행하고, 먼저 콤보 상자를 확인합니다. 물론이 시점에서 comboBox.DataSource는 null이고 comboBox.SelectedItem도 null입니다. 그러나 comboBox의 데이터 바인딩은 이미 설정되어 있습니다 (설정은 양식로드 이벤트에 있기 때문에). 이제는 내 초점을 콤보 상자에서 다른 곳으로 옮길 수 없습니다.

나는 selectedItem가 null를 가지고, 내가 콤보 상자를 확인하려고 할 때 이유는, 생각합니다. 포커스를 다른 곳으로 이동하려고하면 콤보 상자의 데이터 바인딩이 트리거됩니다. 내부적으로 선택된 항목을 문자열로 변환하고 myObject.PickedValue를 해당 변환 된 문자열로 업데이트하려고합니다. null을 문자열로 변환 할 수 없으므로 데이터 바인딩 유효성 검사가 실패하고 유효성 검사 메커니즘으로 다른 곳으로 포커스를 이동하지 못하고이 순간 빨려 들어 파일을 선택하지 못합니다.

내 질문은 내 응용 프로그램 시나리오에서이 트랩을 방지하기 위해 정상적인 바인딩 설치 작업 흐름은 무엇입니까? 그런 데이터 바인딩을 설정하는 올바른 순서는 무엇입니까? 그래서 데이터 소스가 무언가에 채워지기 전에 콤보 박스를 검사 할 수 있습니까?

참고로, 필자는 combobox의 SelectedText 속성에 myObject.PickedValue를 바인딩하려고했습니다. SelectedText가 null이고 SelectedItem이 null 인 경우에도 SelectedText는 문자열이며 null이 아닌 것으로 나타났습니다. 그러나 흥미롭게도, 내가 콤보 박스에서 무언가를 선택했다 할지라도, 데이터 바인딩이 시작될 때 SelectedText는 여전히 빈 문자열이다. 여기 뭐가 잘못 됐니?

도움 주셔서 감사합니다.

답변

1

이것은 올바르게 보이지 않습니다. 문자열 프로퍼티를 null로 설정할 수 있어야한다. 아마도 초점 문제는 다른 곳에있을 수 있습니다. 당신의 이론을 확인하기 위해 재산 세터에 중단 점을 세우려고 했습니까?

콤보 박스의 SelectedText 속성 콤보의 텍스트 부분에서 선택된 텍스트를 말한다. 드롭 다운 스타일이 콤보로 설정된 경우에만 작동합니다. 기본적으로 그것은 콤보 컨트롤의 텍스트 상자 부분의 선택된 텍스트입니다 (콤보 상자가 "콤보"라고하는 이유는 텍스트 상자와 선택 목록의 조합이기 때문입니다). 일반적으로이 속성은 사용자가 콤보의 텍스트 부분을 편집하지 않는 한 비어 있어야합니다.

좋은 사용자 경험과 일치하는이 문제의 해결 방법을 사용하려면 양식로드시 콤보 상자를 해제 한 다음 파일을 가져 왔을 때 사용하도록 설정하십시오. 어떤 선택 항목이 없기 때문에 선택할 수 아무것도 없기 때문에 귀하의 ComboBox, 그냥 실패합니다

+0

해결 방법을 제공해 주셔서 감사합니다. 나는 그것이 준비 될 때까지 콤보 박스를 비활성화하는 것이 좋은 생각이라고 생각한다. 그리고 SelectedText 속성이 왜 작동하지 않는지에 대해 설명해 주셔서 감사합니다. 나는 그것을 답으로 생각할 것입니다. – Steve

3

실패는 당신이 설명하는 것보다 조금 더 간단합니다. 선택할 수 아무것도 존재하지 않는 경우는

난 그냥 ComboBox을 해제합니다. 꽤 쉽게 할 수 있습니다.데이터 객체에 PropertyChanged 이벤트를 연결하는 것을 잊지 마십시오. 바인딩 소스는 리플렉션을 통해 자동으로 찾습니다.

class MyData 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    // ... 
    public HasListOfStrings { get { return ListOfStrings != null && 0 < ListOfStrings.Count; } } 

    private void LoadListOfStrings 
    { 
     // ... load the list of strings ... 

     if (PropertyChanged) { 
      PropertyChanged(this, "ListOfStrings"); 
      PropertyChanged(this, "HasListOfStrings"); 
     } 
    } 
} 

디자이너에서 'ComboBox'의 'Enabled'속성을 HasListOfStrings 속성에 바인딩하십시오. 당신은 함께 코드에서 작업을 수행 할 수 있습니다

listOfStringsComboBox.Bindings.Add ("Enabled", bindingSource, "HasListOfStrings"); 

나는 또한 당신이 EnableAllowFocusChange에 컨테이너 (또는 컨테이너의 컨테이너)의 AutoValidate 속성을 변경하는 것이 좋습니다.

+0

해결 방법은 Larry에게 감사드립니다. 아이디어는 Paul과 비슷하며 코드에 대해 특별히 감사드립니다. 나는 그가 SelectedText 질문에 대답했기 때문에 대답을 취했다. 하지만 근본적으로 네가 그의 것만큼이나 도움이된다. 건배. – Steve

+0

기꺼이 도와 드리겠습니다! – XXXXX