2016-09-08 10 views
1

Ich brauche in meinen ComboBox einen Standardtext zu zeigen, wird dieser Text auch nicht geändert, muss, wenn der Benutzer ein Element der Combobox wählen, tatsächlich dafür tun habe ich diese Struktur geschaffen:ComboBox mit festen Kopf

<ComboBox ItemsSource="{Binding AvailableNations}" Width="160" Height="55" Margin="0, 0, 0, 15" 
      Text="Select Countries" IsEditable="True"> 
    <ComboBox.ItemTemplate> 
     <DataTemplate> 
      <CheckBox IsChecked="{Binding IsChecked}" Content="{Binding Item.Name}" /> 
     </DataTemplate> 
    </ComboBox.ItemTemplate> 
</ComboBox> 

Diese Anzeige als Standardtext Select Countries aber wenn ich ein Element auswähle verschwindet der Standardtext und das ausgewählte Objekt wird angezeigt, wie kann ich das beheben?

+0

'ComboBox' soll den ausgewählten Gegenstand anzeigen. Warum zeigst du '' Select country: '' nicht daneben mit 'TextBlock'? Warum muss es ein Teil von 'ComboBox' sein? Normalerweise wird dieses Verhalten (um einen Hinweis anzuzeigen) verwendet, wenn 'ComboBox' keine Auswahl hat. Aber sobald es einen hat, wird der Hinweis nicht mehr benötigt und der ausgewählte Wert wird angezeigt. – Sinatr

+0

Weil ich einen Standardtext in der Combobox und nicht das ausgewählte Element anzeigen muss, kann der Benutzer weitere Elemente in meiner Combobox auswählen. – AgainMe

+0

Sie können 'Text' auf' 'Select Countries'' einstellen, nachdem die Auswahl verarbeitet wurde (ich nehme an was Sie zeigen diese Mehrfachauswahl dem Benutzer irgendwie an, das Dropdown-Menü zu öffnen, um zu sehen, dass es nicht wie ein gutes Design klingt). Haben Sie versucht, nach vorhandenen Multi-Selection 'ComboBox's zu suchen? Z.B. [hier] (http://stackoverflow.com/q/508506/1997232). – Sinatr

Antwort

2

Sie könnten eine Combined Vorlage verwenden (ref post)

<Window.Resources> 
    <ResourceDictionary> 
     <DataTemplate x:Key="NormalItemTemplate" > 
      <CheckBox IsChecked="{Binding IsChecked}" Content="{Binding Item.Name}" /> 
     </DataTemplate> 
     <DataTemplate x:Key="SelectionBoxTemplate" > 
      <TextBlock>Select Countries</TextBlock> 
     </DataTemplate> 
     <DataTemplate x:Key="CombinedTemplate"> 
      <ContentPresenter x:Name="Presenter" 
        Content="{Binding}" 
        ContentTemplate="{StaticResource NormalItemTemplate}" /> 
      <DataTemplate.Triggers> 
       <DataTrigger 
         Binding="{Binding RelativeSource={RelativeSource FindAncestor,ComboBoxItem,1}}" 
         Value="{x:Null}"> 
        <Setter TargetName="Presenter" Property="ContentTemplate" 
          Value="{StaticResource SelectionBoxTemplate}" /> 
       </DataTrigger> 
      </DataTemplate.Triggers> 
     </DataTemplate> 
    </ResourceDictionary> 
</Window.Resources> 
<Grid> 
    <ComboBox ItemsSource="{Binding AvailableNations}"     
       SelectedItem="{Binding SelectedNation}" 
       ItemTemplate="{StaticResource CombinedTemplate}" 
       Width="160" Height="55" Margin="0, 0, 0, 15" > 
    </ComboBox> 
</Grid> 

Die Funktionsweise ist in der ursprünglichen Antwort beschrieben. Beachten Sie, dass die vorgeschlagene Lösung nur funktioniert, wenn IsEditable auf false gesetzt ist. Ich nehme an, dass das in Ihrem Fall kein Problem sein wird. Zweitens, um den Text beim Start angezeigt zu bekommen, binde ich SelectedItem (z. B. an das erste Element in der Sammlung).

1

Von der comments klingt es so, als ob der Text Select Countries immer angezeigt werden soll, selbst wenn ein Element ausgewählt ist.

Persönlich würde ich einfach die einfache Route gehen und eine TextBox oben auf der ComboBox platzieren, und den Anzeigetext der ComboBox ausblenden, indem Sie eine transparente Vordergrundfarbe verwenden.

Hier ist ein kurzes Beispiel es zeigt:

<Grid> 
    <ComboBox SelectedIndex="1" Foreground="Transparent"> 
     <ComboBox.Resources> 
      <Style TargetType="{x:Type ComboBoxItem}"> 
       <!-- Make sure ComboBoxItems don't have transparent text --> 
       <Setter Property="Foreground" Value="{StaticResource {x:Static SystemColors.ControlTextBrushKey}}" /> 
      </Style> 
     </ComboBox.Resources> 
     <ComboBoxItem>Test 1</ComboBoxItem> 
     <ComboBoxItem>Test 2</ComboBoxItem> 
     <ComboBoxItem>Test 3</ComboBoxItem> 
    </ComboBox> 

    <TextBlock Text="Select Countries" Margin="4,3" IsHitTestVisible="False" /> 
</Grid> 

Und die Ergebnisse (beachten Sie, dass SelectedIndex = 1)

enter image description here

Ich bin sicher, dass auch andere Möglichkeiten gibt es, wie die Art und Weise zu überschreiben sie malt den Anzeigetext oder ändert die Kontrollvorlage, aber das erschien mir am einfachsten.

+0

Danke für die Antwort, ich habe +1 geschätzt – AgainMe