2008-11-07 13 views
6

Ich kann nicht scheinen, ein ContentTemplate für ein ComboBoxItem festzulegen. Aus diesem Grund versuche ich, zwei Einträge für meine Daten in der Combobox zu haben. Wenn das Kombinationsfeld geöffnet ist (Menü ist inaktiv), möchte ich ein Textfeld (mit dem Namen des Bildes) und ein Bildsteuerelement darunter. Wenn ich das Element auswähle, möchte ich, dass das Kombinationsfeld nur ein Textfeld mit dem Namen des Bildes anzeigt.Wie verwende ich eine andere Vorlage für ausgewählte und Dropdown-Status in Kombinationsfeld in Silverlight?

Ich dachte, ich könnte dies erreichen, indem Sie die ItemTemplate und ItemContainerStyle der ComboBox ändern. Die ItemContainerStyle enthält folgenden Content:

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

So ging ich davon aus, dass ich nur den Content hier einstellen könnte und es würde funktionieren. Aber ich kann nicht scheinen, um es an der Arbeit:

<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}"/> 

... 

Hier ist mein Kombinationsfeld:

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

Die einzige Art, wie ich dies an der Arbeit bekommen kann, ist die Content vom ItemContainerStyle zu entfernen, und Ersetzen Sie es durch den Inhalt meiner benutzerdefinierten Vorlage (ComboBoxItemTemplate). Aber ich dachte nicht, dass ich diesen Ansatz verwenden sollte, da dies bedeuten würde, dass der ContentPresenter nicht mehr existiert (und der Code in der ComboBox könnte darauf beruhen, dass er existiert).

Jede Hilfe bei der Anzeige einer Combo-Box mit einem anderen Dropdown und ausgewählte Vorlage würde sehr geschätzt werden!

Antwort

5

Die ComboBox.ItemTemplate ist nur eine bequeme Möglichkeit zum Festlegen der ComboBoxItem.ContentTemplate. Dein Code oben versucht also grundsätzlich das ComboBoxItem.ContentTemplate zweimal zu setzen.

Wie Jobi sagte, könnten Sie versuchen, nur einen benutzerdefinierten Stil zu verwenden. Sie können den ContentPresenter sicher ausschließen, wenn Sie den Inhaltstyp immer kennen. Mit dem ContentPresenter können Sie nur ein DataTemplate verwenden, um einige zufällige Daten anzuzeigen. Aber Sie könnten es einfach durch einen TextBlock und ein Bild ersetzen. Sie verlieren nur die Möglichkeit, ein DataTemplate anzugeben.

Das Problem mit Jobis Ansatz ist, dass das ausgewählte Objekt sein Bild nicht zeigt, auch wenn es in der Dropdown-Liste ist. Das ausgewählte Objekt wird an zwei Stellen angezeigt (Dropdown-Liste und Hauptteil der ComboBox). An einer Stelle möchten Sie eine DataTemplate und in der anderen möchten Sie eine andere DataTemplate.

Ihre beste Wette ist, die ComboBox neu zu gestalten. Sie können den Standard-Style von here erhalten. Es gibt einen ContentPresenter mit dem Namen "ContentPresenter". Sie würden müssen:

  1. Entfernen/den Namen des Content ändern, so der ComboBox nicht automatisch die Content/Content Eigenschaften
  2. Bind die Content gesetzt wird.Content-Eigenschaft wie folgt: „{Template SelectedObject}“
  3. Stellen Sie die ContentPresenter.ContentTemplate Eigenschaft auf Ihrem Datatemplate, ohne das Bild
  4. Stellen Sie die ComboBox.ItemTemplate Eigenschaft auf die Datatemplate mit einem Bild und Textblock wie Sie waren
  5. Give der ComboBox Stil eines expliziter Schlüssel, wie x: Key = "MyComboBoxStyle"
  6. Verwenden Sie den Stil auf ComboBox, wie Style = "{Static MyComboBoxStyle}"

Dies ignoriert effektiv die ComboBoxItem.ContentTemplate, wenn die Anzeige ausgewählte ite m im Body der ComboBox, verwendet sie aber, wenn das ComboBoxItem in der Dropdown-Liste angezeigt wird.

+0

Wirklich hilfreich. Vielen Dank. Nur um zu klären, wie ich mich damit abmühte, das "SelectedObject" zu ersetzen, obwohl es jetzt offensichtlich erscheint. Mein Code-Fragment für den Content sieht wie folgt aus:

0

Sie können dies nur mit ItemsContainerStyle erreichen. Fügen Sie Ihren TextBlock und Ihr Bild anstelle des ContentPresenters hinzu. Fügen Sie den VisualStateManager hinzu und aktivieren Sie die Sichtbarkeit des Image-Steuerelements basierend auf dem ausgewählten Status des VSM.

+0

Was ist der Punkt des ItemTemplate dann, und wird auch kein ContentPresenter ein potenzielles Problem verursachen? –

0

DataTemplate ist hauptsächlich für Ihre Datenvisualisierung, Es ist besser, alle UI bezogenen Dynamiken innerhalb der ControlTemplate (Control Verhaltensweisen) zu geben. Es gibt kein potenzielles Problem, wenn Sie keinen ContentPresenter haben. Das einzige Problem ist, dass Sie dieses ControlTemplate von einer anderen ComboBox wiederverwenden möchten. Dann können Sie dort eine andere saubere Control-Vorlage mit einem ContentPresenter deklarieren.