WinForms ComboBox 데이터 바인딩의 함정 이해하기

.NET에서 Windows Forms 애플리케이션을 개발해왔다면 ComboBox 컨트롤을 사용할 때 예상치 못한 동작을 경험했을 것입니다. 두 개의 ComboBox 컨트롤이 동일한 데이터 원본에 바인딩될 때 발생하는 일반적인 문제입니다. 한 ComboBox에서 선택을 변경하면 다른 ComboBox도 변경됩니다! 이 게시물에서는 왜 이런 일이 발생하는지, 그리고 이를 해결하는 방법을 살펴보겠습니다.

문제

예제 설정

두 개의 ComboBox 컨트롤이 생성되어 문자열 목록에 바인딩되는 다음 예제를 고려해 보겠습니다:

List<string> myitems = new List<string>
{
    "아이템 1",
    "아이템 2",
    "아이템 3"
};

ComboBox box = new ComboBox();
box.DataSource = myitems;

ComboBox box2 = new ComboBox();
box2.DataSource = myitems;

무슨 일이 일어날까요?

  1. 동일한 데이터 원본에 바인딩:ComboBox 컨트롤 모두 같은 아이템 목록을 사용합니다.
  2. 선택 변경:ComboBox에서 선택된 항목을 변경하면, 다른 ComboBox에서도 동일한 항목이 자동으로 선택됩니다.

왜 이런 일이 발생하나요?

문제의 근본 원인은 .NET 프레임워크에서 데이터 바인딩을 처리하는 방식, 특히 **BindingContext**에 있습니다.

BindingContext 이해하기

BindingContext는 왜 이러한 변경이 동시에 발생하는지를 이해하는 데 중요합니다. 작동 방식은 다음과 같습니다:

  • 공유 컨트롤 컨텍스트: 기본적으로 Windows Form의 모든 컨트롤은 동일한 BindingContext를 공유합니다.
  • 데이터 바인딩 메커니즘: ComboBoxDataSource를 설정할 때, 이는 이 BindingContext를 사용하여 **ConcurrencyManager**에 대한 참조를 얻습니다.
  • 현재 선택 추적: ConcurrencyManager는 목록에서 현재 선택된 위치를 추적하는 역할을 합니다. 두 개의 ComboBox 컨트롤이 동일한 컨텍스트를 공유하기 때문에 동일한 현재 선택을 반영하게 됩니다.

BindingContext가 어떻게 작동하는지에 대한 자세한 내용을 알고 싶다면 공식 Microsoft 문서를 참조하십시오.

해결 방법: 배열 사용하기

선택의 동시 변경을 피하기 위해 ComboBox 컨트롤의 바인딩 방식을 수정할 수 있습니다. List에 직접 바인딩하는 대신 그것을 배열로 변환하세요:

ComboBox box = new ComboBox();
box.DataSource = myitems.ToArray();

왜 효과적일까요?

  • 별도의 배열: .ToArray()를 사용함으로써 다른 ComboBoxBindingContext 참조를 공유하지 않는 새로운 배열 인스턴스를 생성합니다.
  • 독립적인 선택: 이제 각 ComboBox는 자신의 데이터 컨텍스트를 가지며 서로 간섭하지 않고 서로 다른 선택을 유지할 수 있습니다.

결론

WinForms로 개발할 때 데이터 바인딩의 뉘앙스로 인해 예상치 못한 동작이 발생할 수 있습니다. BindingContextConcurrencyManager의 작동 방식을 이해하면 이러한 문제를 효과적으로 해결할 수 있습니다. 바인딩할 때 데이터 원본을 배열로 변환함으로써 원하는 기능을 달성하고 애플리케이션이 예상대로 작동하도록 할 수 있습니다.

주요 요점

WinForms에서 데이터 바인딩이 작동하는 방식에 항상 유의하세요. 적절한 처리 없이 동일한 원본에 여러 컨트롤을 바인딩하면 이러한 복잡한 상황을 초래할 수 있습니다!