2009-06-18 4 views
0

열거 형 값을 나타 내기 위해 여러 콤보 상자를 만들어야합니다. 값을 왼쪽에 그래픽 미리보기와 오른쪽 텍스트로 나타내기를 원합니다. 디스플레이의 "미리보기"부분은 컨트롤, 이미지 또는 기타 내용 일 수 있습니다. 두 가지 방법을 시도해 보았지만 둘 다 실패했습니다. 그래서 몇 가지 대안이 무엇인지 궁금합니다. 내 테스트에서 "미리보기"는 만들기 쉽기 때문에 버튼이지만 실제로는 사용자 정의 컨트롤이나 DrawingImage 컨트롤 중 하나입니다.임의의 내용을 항목 템플릿의 일부로 표시하는 ComboBox를 만드는 방법은 무엇입니까?

첫 번째 방법으로는 ContentPresenter을 사용하여 나를위한 미리보기 콘텐츠를 표시했습니다. 이를 위해 적절한 속성과 템플릿으로 컨트롤을 만들었습니다. 이 컨트롤의 인스턴스로 채워진 컬렉션 유형을 만든 다음 컬렉션의 인스턴스를 내 윈도우의 리소스에 넣습니다. ComboBox의 ItemSource 속성을이 컬렉션에 바인딩했습니다. 하나의 ComboBox가있을 때 훌륭하게 작동하지만, 리소스를 사용하는 ComboBox가 여러 개인 경우 ComboBox 중 하나에 값이 표시되지 않습니다. 저는 이것이 아마도 통제가 그 내용이고, 어떤 종류의 보육 문제가 계속되고 있다는 사실과 관련이 있다고 생각합니다.

이 방법을 잘못 사용하기로 결정하고 ComboBox의 ItemTemplate을 사용하여 더러운 작업을 시도했습니다. Control 대신 DependencyObject에서 상속하도록 데이터 클래스를 다시 디자인하고 이전 스타일을 데이터 형식의 데이터 템플릿으로 사용했습니다. 여러 ComboBox가 동일한 리소스 인스턴스에 바인딩되는 경우 여전히 문제가 있습니다. 첫 번째 ComboBox는 미리보기 콘텐츠를 제대로 표시하지만 두 번째 ComboBox를 내리면 두 ComboBox에서 미리보기 콘텐츠가 사라집니다. 이 방법에서는 선택한 항목이 ComboBox에도 표시되지 않지만 설정해야하는 다른 템플릿을 놓친 경우도 있습니다. DataTemplate을 ComboBox의 ItemTemplate으로 직접 설정하면 선택한 항목이 제대로 표시되지만 팝업의 컨트롤이 손상됩니다. 나는 여기서 바로 일을하지 않을거야.

두 번째 방법은 내 리소스에 컬렉션 인스턴스 두 개를 만드는 경우 작동하지만 실제로는 실용적이지 않습니다. 코드에서 컬렉션의 개인 인스턴스에 대한 바인딩을 설정하기 위해 응용 프로그램을 다시 구성 할 수는 있지만, 이는 다소 괴롭다. 컬렉션의 각 유형에 대해 새로운 ComboBox를 파생시키고 컬렉션의 새 인스턴스를 자동으로 사용하게 할 수 있지만 너무 많은 작업처럼 보입니다. 내가 원하는 것은 너무 드문 일이 아닌 것처럼 보이지만 작동하는 것을 찾을 수없는 것 같습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+0

저는 현재 미리보기 부분을 이미지 컨트롤로 나타내도록하고 원하는 내용이 ImageSource에 렌더링되도록하는 것으로 인해이 문제를 해결하기 위해 노력하고 있습니다. – OwenP

답변

2

ItemControl의 내용으로 FrameworkElement 파생 개체를 사용하면 안되므로 한 번만 표시 할 수 있습니다.

대신 DataTemplates를 사용하여 항목이 ComboBox에 표시되는 방법을 제어하십시오. 정말 복잡한 경우에는 DataTemplate 선택기를 사용할 수 있습니다. Bea Stollnitz는 here에 관한 훌륭한 게시물을 보유하고 있습니다.

+0

첫 번째 문제는 문제의 일부라고 생각했지만 DataTemplates를 사용할 때도 문제가 계속 발생합니다. 두 ComboBox 모두 동일한 소스 컬렉션을 사용하기 때문에 동일한 컨트롤을 사용하고 있습니다. – OwenP

+0

바로 그게 문제입니다. Image는 FrameworkElement에서 파생됩니다. 즉, 다른 컨트롤에서 다시 사용할 수 없으며 한 번만 표시 할 수 있습니다. 대신 DataTemplate에서 Image 컨트롤을 사용하고 데이터 대신 이미지 대신 ImageSource를 표시해야합니다. – micahtan

+0

그게 제가 마지막 코멘트에서 동의 한 것입니다. 현재 사용하는 해결 방법은 데이터 항목이 개체를 반환하는 데 사용되는 ImageSource를 반환해야합니다.이제 데이터 항목이 컨트롤을 미리보기로 사용하려는 경우 RenderTargetBitmap을 사용하여 DataTemplate의 Image 컨트롤에 바인딩 된 ImageSource에 컨트롤을 렌더링해야합니다. – OwenP

관련 문제