2010-02-26 22 views
5

que tiene un cuadro combinado que se basa en una plantilla de datos incluye la casilla de verificación, como por ejemplo:texto 'por defecto' de cuadro combinado con plantilla

<ComboBox x:Name="cboComplex" Text="Select days..."> 
     <ComboBox.ItemTemplate> 
      <DataTemplate> 
       <StackPanel Orientation="Horizontal"> 
        <CheckBox IsChecked="{Binding Path=IsSelected}" Width="20"/> 
        <TextBlock Text="{Binding DayOfWeek}" Width="100" /> 
       </StackPanel> 
      </DataTemplate> 

     </ComboBox.ItemTemplate> 
    </ComboBox> 

El problema que estoy teniendo es que me gustaría que el cuadro combinado para mostrar "Seleccionar días ..." y luego mostrar la lista cuando se hace clic. Lamentablemente, la configuración de la propiedad de texto parece no tener ningún efecto. Cualquier idea o ayuda sería muy apreciada.

¡Gracias de antemano!

Sieg

Respuesta

2

Usted tendrá que crear un nuevo elemento en su clase de colección subyacente con el valor "días indicados ...", con el índice [0] y cambia el índice seleccionado a 0.

<ComboBox x:Name="cboComplex" SelectedIndex="0"> 
     <ComboBox.ItemTemplate> 
      <DataTemplate> 
       <StackPanel Orientation="Horizontal"> 
        <CheckBox IsChecked="{Binding Path=IsSelected}" Width="20"/> 
        <TextBlock Text="{Binding DayOfWeek}" Width="100" /> 
       </StackPanel> 
      </DataTemplate> 

     </ComboBox.ItemTemplate> 
    </ComboBox> 

O la otra opción es colocar una etiqueta encima con el texto "Seleccionar días ...", y luego escuchar el evento OnSelectionChanged, y si el SelectedIndex no es -1, cambie la visibilidad de las etiquetas a falso, de lo contrario es cierto. p.ej.

private void MyListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     if (MyListBox.SelectedIndex >= 0) 
     { 
      MyListBoxInitialLabel.Visibility = Visibility.Hidden; 
     } 
     else 
     { 
      MyListBoxInitialLabel.Visibility = Visibility.Visible; 
     } 
    } 
5

La propiedad de texto se utiliza cuando el ComboBox es editable. Puede establecer un mensaje de tipo "Seleccionar" predeterminado agregando un elemento a ControlTemplate que aparece solo cuando no hay selección y luego desaparece. Con este método, no tiene que preocuparse por modificar su colección o que el usuario intente elegir el mensaje "Seleccionar" de la lista porque no forma parte de la lista. Me gustaría recomendar el uso de la etiqueta de definir el mensaje en cada instancia o en un estilo y luego añadir un nuevo TextBlock para mostrar en la plantilla por defecto:

<TextBlock x:Name="SelectMessage" HorizontalAlignment="Left" Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Tag}" VerticalAlignment="Center" Margin="{TemplateBinding Padding}" Visibility="Collapsed"/> 

entonces se podría utilizar de esta manera:

<ComboBox ItemsSource="{Binding MyList}" Template="{StaticResource ComboBoxMessageTemplate}" Tag="Select days..."/> 

Aquí hay una copia completa de Blend generated de la plantilla predeterminada de Aero ComboBox con los cambios. También tendrá el tema de espacio de nombres (xmlns: Microsoft_Windows_Themes = "clr-namespace: Microsoft.Windows.Themes; montaje = PresentationFramework.Aero") y una referencia al ensamblado PresentationFramework.Aero:

<Geometry x:Key="DownArrowGeometry">M 0 0 L 3.5 4 L 7 0 Z</Geometry> 
<Style x:Key="ComboBoxReadonlyToggleButton" TargetType="{x:Type ToggleButton}"> 
    <Setter Property="OverridesDefaultStyle" Value="true"/> 
    <Setter Property="IsTabStop" Value="false"/> 
    <Setter Property="Focusable" Value="false"/> 
    <Setter Property="ClickMode" Value="Press"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type ToggleButton}"> 
       <Microsoft_Windows_Themes:ButtonChrome x:Name="Chrome" SnapsToDevicePixels="true" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" RenderMouseOver="{TemplateBinding IsMouseOver}" RenderPressed="{TemplateBinding IsPressed}"> 
        <Grid HorizontalAlignment="Right" Width="{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}"> 
         <Path x:Name="Arrow" Fill="Black" HorizontalAlignment="Center" Margin="3,1,0,0" VerticalAlignment="Center" Data="{StaticResource DownArrowGeometry}"/> 
        </Grid> 
       </Microsoft_Windows_Themes:ButtonChrome> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsChecked" Value="true"> 
         <Setter Property="RenderPressed" TargetName="Chrome" Value="true"/> 
        </Trigger> 
        <Trigger Property="IsEnabled" Value="false"> 
         <Setter Property="Fill" TargetName="Arrow" Value="#AFAFAF"/> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

<ControlTemplate x:Key="ComboBoxMessageTemplate" TargetType="{x:Type ComboBox}"> 
    <Grid x:Name="MainGrid" SnapsToDevicePixels="true"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="*"/> 
      <ColumnDefinition MinWidth="{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}" Width="0"/> 
     </Grid.ColumnDefinitions> 
     <Popup x:Name="PART_Popup" Margin="1" AllowsTransparency="true" IsOpen="{Binding IsDropDownOpen, RelativeSource={RelativeSource TemplatedParent}}" Placement="Bottom" PopupAnimation="{DynamicResource {x:Static SystemParameters.ComboBoxPopupAnimationKey}}" Grid.ColumnSpan="2"> 
      <Microsoft_Windows_Themes:SystemDropShadowChrome x:Name="Shdw" MaxHeight="{TemplateBinding MaxDropDownHeight}" MinWidth="{Binding ActualWidth, ElementName=MainGrid}" Color="Transparent"> 
       <Border x:Name="DropDownBorder" Background="{DynamicResource {x:Static SystemColors.WindowBrushKey}}" BorderBrush="{DynamicResource {x:Static SystemColors.WindowFrameBrushKey}}" BorderThickness="1"> 
        <ScrollViewer CanContentScroll="true"> 
         <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" KeyboardNavigation.DirectionalNavigation="Contained"/> 
        </ScrollViewer> 
       </Border> 
      </Microsoft_Windows_Themes:SystemDropShadowChrome> 
     </Popup> 
     <ToggleButton Style="{StaticResource ComboBoxReadonlyToggleButton}" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" Grid.ColumnSpan="2" IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}"/> 
     <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" IsHitTestVisible="false" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" Content="{TemplateBinding SelectionBoxItem}" ContentStringFormat="{TemplateBinding SelectionBoxItemStringFormat}" ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}" ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}"/> 
     <TextBlock x:Name="SelectMessage" HorizontalAlignment="Left" Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Tag}" VerticalAlignment="Center" Margin="{TemplateBinding Padding}" Visibility="Collapsed"/> 
    </Grid> 
    <ControlTemplate.Triggers> 
     <Trigger Property="SelectedItem" Value="{x:Null}"> 
      <Setter Property="Visibility" TargetName="SelectMessage" Value="Visible"/> 
     </Trigger> 
     <Trigger Property="HasDropShadow" SourceName="PART_Popup" Value="true"> 
      <Setter Property="Margin" TargetName="Shdw" Value="0,0,5,5"/> 
      <Setter Property="Color" TargetName="Shdw" Value="#71000000"/> 
     </Trigger> 
     <Trigger Property="HasItems" Value="false"> 
      <Setter Property="Height" TargetName="DropDownBorder" Value="95"/> 
     </Trigger> 
     <Trigger Property="IsEnabled" Value="false"> 
      <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/> 
      <Setter Property="Background" Value="#FFF4F4F4"/> 
     </Trigger> 
     <Trigger Property="IsGrouping" Value="true"> 
      <Setter Property="ScrollViewer.CanContentScroll" Value="false"/> 
     </Trigger> 
    </ControlTemplate.Triggers> 
</ControlTemplate> 
+1

+1 Gracias, buena respuesta. Solo una cosa adicional para agregar al TextBlock es HitTestVisible = "False". –

+0

Bonita solución, tanto XAML puro como sin abuso de propiedad de texto, gana todo :) – dain

2

Mostrar por defecto texto en cuadro combinado

<ComboBox Height="23" HorizontalAlignment="Left" Margin="180,18,0,0" Name="cmbExportData" VerticalAlignment="Top" Width="148" ItemsSource="{Binding}" Text="-- Select Value --" AllowDrop="False" IsEditable="True" IsManipulationEnabled="False" IsReadOnly="True" /> 
  • Establecer la propiedad de texto del cuadro combinado
  • Marcar como IsEditable = true
  • Marcar como IsReadOnly = true
Cuestiones relacionadas