2008-11-07 1 views
6

ComboBoxItem에 대해 ContentTemplate을 설정할 수 없습니다. 거기에 내가하려고하는 이유는 콤보 상자에 내 데이터에 대한 2 개의 모습을 갖고 싶기 때문입니다. 콤보 상자가 열리면 (메뉴가 아래로) 텍스트 상자 (이미지 이름 포함)와 그 아래에 이미지 컨트롤이 필요합니다. 항목을 선택하면 콤보 상자에 이미지의 이름이있는 텍스트 상자가 표시됩니다.Silverlight의 콤보 상자에서 선택한 상태와 드롭 다운 상태에 다른 템플릿을 사용하는 방법?

ComboBox의 ItemTemplate 및 ItemContainerStyle을 수정하여이 작업을 수행 할 수 있다고 생각했습니다. ItemContainerStyle는 다음 ContentPresenter에 포함되어 있습니다

<ContentPresenter HorizontalAlignment="Left" Margin="{TemplateBinding Padding}" x:Name="contentPresenter" Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}"/> 

그래서 난 그냥 여기에 ContentTemplate을 설정할 수 및 작동한다고 가정한다.

<DataTemplate x:Key="ComboBoxDataTemplate"> 
      <Grid> 
       <TextBlock Text="{Binding Path='Name'}"/> 
      </Grid> 
     </DataTemplate> 

<DataTemplate x:Key="ComboBoxItemTemplate"> 
      <StackPanel> 
       <TextBlock Text="{Binding Path='Name'}"/> 
       <Image Source="{Binding Path='Source'}" Width="64" Height="64"/> 
      </StackPanel> 
     </DataTemplate> 

     <Style x:Key="ComboBoxItemStyle1" TargetType="ComboBoxItem"> 
... 
      <Setter Property="ContentTemplate" Value="{StaticResource ComboBoxItemTemplate}"/> 

... 

가 여기 내 콤보 상자의 : :하지만 그것을 얻이 수없는 것

<ComboBox Width="70" Margin="3,0,0,0" 
         ItemsSource="{StaticResource Source}" 
         ItemTemplate="{StaticResource ComboBoxDataTemplate}" 
         ItemContainerStyle="{StaticResource ComboBoxItemStyle1}" 
         /> 

나는 일이 얻을 수있는 유일한 방법은 ItemContainerStyle에서 ContentPresenter에를 제거하고, 내 사용자 지정 서식 파일 (ComboBoxItemTemplate)의 내용으로 바꿉니다. 그러나 ContentPresenter가 더 이상 존재하지 않으며 ComboBox의 코드가 기존에 의존 할 수 있으므로이 방법을 사용해야한다고 생각하지 않았습니다.

다른 드롭 다운 및 선택한 템플릿으로 콤보 상자를 표시하는 데 도움이 필요하시면 크게 감사하겠습니다!

답변

5

ComboBox.ItemTemplate은 ComboBoxItem.ContentTemplate을 설정하는 편리한 방법 일뿐입니다. 위의 코드는 기본적으로 ComboBoxItem.ContentTemplate을 두 번 설정하려고합니다.

Jobi가 지적했듯이 사용자 정의 스타일 만 사용해도됩니다. 콘텐츠 유형을 항상 알고있는 경우 ContentPresenter를 안전하게 제외 할 수 있습니다. ContentPresenter를 사용하면 DataTemplate을 사용하여 임의의 데이터를 표시 할 수 있습니다. 그러나 TextBlock과 Image로 대체 할 수 있습니다. DataTemplate을 지정할 수있는 기능이 없어집니다.

Jobi의 접근 방식에 문제가있는 것은 드롭 다운에 있어도 선택 항목에 이미지가 표시되지 않는다는 것입니다. 선택한 항목은 실제로 두 위치 (드롭 다운과 ComboBox의 본문)에 표시됩니다. 한 위치에서 하나의 DataTemplate을 원한다. 다른 위치에 다른 DataTemplate을 원한다.

가장 좋은 방법은 ComboBox를 다시 스타일 변환하는 것입니다. 기본 스타일은 here에서 가져올 수 있습니다. "ContentPresenter"라는 이름을 가진 ContentPresenter가 있습니다. 콤보 상자가 자동으로 컨텐츠/ContentTemplate 속성

  • 바인드 ContentPresenter에
  • 를 설정하지 않도록,

    1. /제거 된 ContentPresenter의 이름을 변경 : 당신은해야합니다.그래서 같은 Content 속성 : "{TemplateBinding SelectedObject}"
    2. 당신 같은 이미지와 TextBlock을 가진 DataTemplate을에 ComboBox.ItemTemplate 속성을 설정 이미지
    3. 없이의 DataTemplate에 ContentPresenter.ContentTemplate 속성을했다 설정
    4. 가지 적어 콤보 스타일 X와 같은 명시 적으로 키, 상기를 표시 할 때 키 = "MyComboBoxStyle"
    5. 사용하여 콤보 상자에 스타일, 스타일처럼 = "{정적 리소스 MyComboBoxStyle}는"

    이 효과적으로 ComboBoxItem.ContentTemplate를 무시 선택된 ite m을 ComboBox의 본문에 사용하지만 드롭 다운에 ComboBoxItem을 표시 할 때 사용합니다.

    +0

    정말 도움이됩니다. 감사. 내가 'SelectedObject'를 대체 할 대상으로 고심하면서 명확 해지기는했지만 지금은 분명해 보인다. 는 ContentPresenter에 대한 내 코드는 다음과 같습니다

    0

    ItemsContainerStyle만으로이 작업을 수행 할 수 있습니다. ContentPresenter 대신 TextBlock 및 Image를 추가하십시오. VisualStateManager를 추가하고 VSM의 선택된 상태를 기반으로 Image 컨트롤의 가시성을 토글합니다.

    +0

    그런 다음 ItemTemplate의 요점은 무엇이며 ContentPresenter를 사용하지 않아도 잠재적 인 문제가 발생합니까? –

    0

    DataTemplate은 주로 데이터 시각화를위한 것으로, 모든 UI 관련 역학을 ControlTemplate (제어 동작) 내에 제공하는 것이 좋습니다. ContentPresenter가 없다면 잠재적 인 문제는 없습니다. 유일한 문제는 다른 ComboBox에서이 ControlTemplate을 다시 사용하려는 경우입니다. 그런 다음 거기에 ContentPresenter가있는 다른 깨끗한 Control 템플릿을 선언 할 수 있습니다.

    관련 문제