Multiple element combo box z nagłówkami?
Czy możliwe jest, aby "nagłówki kolumn" na polu combo były powiązane z wieloma elementami? Na przykład pole wyboru, które wyświetla nazwę osoby. W skrzynce będzie wyświetlany John Doe. Ale chciałbym wyświetlić nagłówki kolumn:
First Last
John Doe
Jane Doe
Jimmy Doe
Czy jest to możliwe bez użycia siatki danych? A co z prostym rozwiązaniem, które obejmuje wykorzystanie siatki danych? Znalazłem jedno rozwiązanie do osadzania siatki danych w polu combo, ale wygląda to trudne i wymaga MS Blend.
I ' d be happy if I może po prostu uzyskać nagłówki jako pierwszy wiersz w rozwijanej liście.
G
Oto Mój kod xaml z próbą HB, która powoduje błąd kompilacji, jak wspomniano w komentarzach.
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:dg="http://schemas.microsoft.com/wpf/2008/toolkit"
<ComboBox Name="cboPlaceNames" Grid.IsSharedSizeScope="True" ItemsSource="{DynamicResource items}" Height="22" Width="285" Margin="0,6,165,0" SelectedIndex="0" HorizontalAlignment="Right" VerticalAlignment="Top" SelectionChanged="cboPlaceNames_SelectionChanged">
<ComboBox.Resources>
<CompositeCollection x:Key="items">
<ComboBoxItem IsEnabled="False">
<Grid TextElement.FontWeight="Bold">
<Grid.ColumnDefinitions>
<ColumnDefinition SharedSizeGroup="A"/>
<ColumnDefinition Width="5"/>
<ColumnDefinition SharedSizeGroup="B"/>
<ColumnDefinition Width="5"/>
<ColumnDefinition SharedSizeGroup="C"/>
</Grid.ColumnDefinitions>
<Grid.Children>
<TextBlock Grid.Column="0" Text="Name"/>
<TextBlock Grid.Column="2" Text="CLLI"/>
<TextBlock Grid.Column="4" Text="Street"/>
</Grid.Children>
</Grid>
</ComboBoxItem>
<Separator/>
<CollectionContainer Collection="{Binding Source={x:Reference cboPlaceNames}, Path=DataContext.Data}"/>
</CompositeCollection>
<DataTemplate DataType="x:Type obj:PlaceName">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition SharedSizeGroup="A"/>
<ColumnDefinition Width="5"/>
<ColumnDefinition SharedSizeGroup="B"/>
<ColumnDefinition Width="5"/>
<ColumnDefinition SharedSizeGroup="C"/>
</Grid.ColumnDefinitions>
<Grid.Children>
<TextBlock Grid.Column="0" Text="{Binding Name}"/>
<TextBlock Grid.Column="2" Text="{Binding CLLI}"/>
<TextBlock Grid.Column="4" Text="{Binding Street}"/>
</Grid.Children>
</Grid>
</DataTemplate>
</ComboBox.Resources>
</ComboBox>
4 answers
Przykład:
<ComboBox Name="cb" Grid.IsSharedSizeScope="True" ItemsSource="{DynamicResource items}">
<ComboBox.Resources>
<CompositeCollection x:Key="items">
<ComboBoxItem IsEnabled="False">
<Grid TextElement.FontWeight="Bold">
<Grid.ColumnDefinitions>
<ColumnDefinition SharedSizeGroup="A"/>
<ColumnDefinition Width="5"/>
<ColumnDefinition SharedSizeGroup="B"/>
</Grid.ColumnDefinitions>
<Grid.Children>
<TextBlock Grid.Column="0" Text="Name"/>
<TextBlock Grid.Column="2" Text="Occupation"/>
</Grid.Children>
</Grid>
</ComboBoxItem>
<Separator/>
<CollectionContainer Collection="{Binding Source={x:Reference cb}, Path=DataContext.Data}"/>
</CompositeCollection>
<DataTemplate DataType="{x:Type obj:Employee}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition SharedSizeGroup="A"/>
<ColumnDefinition Width="5"/>
<ColumnDefinition SharedSizeGroup="B"/>
</Grid.ColumnDefinitions>
<Grid.Children>
<TextBlock Grid.Column="0" Text="{Binding Name}"/>
<TextBlock Grid.Column="2" Text="{Binding Occupation}"/>
</Grid.Children>
</Grid>
</DataTemplate>
</ComboBox.Resources>
</ComboBox>
Zauważ, że uzyskanie Collection
-wiążącego prawa nie jest takie proste, ponieważ nie ma DataContext
ani VisualTree, na którym można polegać, ElementName
i RelativeSource
nie działa, dzieje się tak dlatego, że CompositeCollection
jest tylko zbiorem, a nie frameworkiem.
Poza tym sposób, w jaki odbywa się to za pomocą siatek, które mają współdzielone kolumny rozmiaru. Tablica danych jest stosowana automatycznie za pomocą DataType
.
Edit: Ustawianie nagłówka-ComboBoxItem ' s IsHitTestVisible
właściwość False
nie jest wystarczająca, ponieważ nadal można ją wybrać za pomocą klawiatury. Teraz zmieniłem go na IsEnabled="False"
, co nieco zanika. Prawdopodobnie możesz zmienić szablon tego elementu, aby tego nie robić. Lub jeśli znajdziesz inny sposób wyłączenia go z wyboru, który oczywiście również się sprawdzi.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-27 17:55:02
Najprostszym sposobem dodawania nagłówków kolumn do combobox jest użycie listview w combobox. Poniższy kod daje rozwiązanie do niego.
<ComboBox HorizontalAlignment="Center"
IsTextSearchEnabled="False" Width="200"
IsEditable="True" Text="{Binding }">
<ListView ItemsSource="{Binding YOURITEMSOURCE}"
SelectedItem="{Binding Path=SELECTEDITEMSOURCE}"
Height="200" ScrollViewer.VerticalScrollBarVisibility="Visible">
<ListView.View>
<GridView>
<GridViewColumn Width="130" Header="Name" DisplayMemberBinding="{Binding Name}" />
<GridViewColumn Width="130" Header="Occupation" DisplayMemberBinding="{Binding Occupation}" />
<GridViewColumn Width="130" Header="Age" DisplayMemberBinding="{Binding Age}" />
<GridViewColumn Width="130" Header="Salary" DisplayMemberBinding="{Binding Salary}" />
</GridView>
</ListView.View>
</ListView>
</ComboBox>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-12 11:32:49
Zastosuj następujący styl do Comboboxu.
<Style x:Key="ListViewComboBox" TargetType="{x:Type ComboBox}">
<Style.Resources>
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}"
Color="LightBlue"/>
</Style.Resources>
<Setter Property="ScrollViewer.CanContentScroll" Value="true"/>
<Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto"/>
<Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/>
<Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"/>
<Setter Property="BorderBrush" Value="Black"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="FontFamily" Value="Arial"/>
<Setter Property="FontSize" Value="12"/>
<Setter Property="Foreground" Value="Black"/>
<Setter Property="Margin" Value="0"/>
<Setter Property="Padding" Value="0"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ComboBox}">
<Border Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
CornerRadius="3"
SnapsToDevicePixels="True">
<Grid>
<Border x:Name="Border">
<Popup x:Name="PART_Popup" AllowsTransparency="true" IsOpen="{TemplateBinding IsDropDownOpen}" Placement="Bottom" PopupAnimation="{DynamicResource {x:Static SystemParameters.ComboBoxPopupAnimationKey}}" Focusable="False">
<Border x:Name="Shdw"
MaxHeight="{TemplateBinding MaxDropDownHeight}"
MinWidth="{Binding ActualWidth, ElementName=Border}">
<Border x:Name="DropDownBorder"
Background="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="1">
<ListView KeyboardNavigation.DirectionalNavigation="Contained"
ItemsSource="{TemplateBinding ItemsSource}"
SelectedItem="{Binding Mode=TwoWay, Path=SelectedItem, RelativeSource={RelativeSource Mode=TemplatedParent}}"
View="{TemplateBinding Tag}"/>
</Border>
</Border>
</Popup>
</Border>
<DockPanel Margin="2">
<FrameworkElement DockPanel.Dock="Right"
Width="{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}"/>
<Border x:Name="SelectedItemBorder" Margin="{TemplateBinding Padding}">
<Grid>
<ContentPresenter Content="{TemplateBinding SelectionBoxItem}"
ContentStringFormat="{TemplateBinding SelectionBoxItemStringFormat}"
ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}"
ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
Margin="1,1,1,1"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
</Grid>
</Border>
</DockPanel>
<ToggleButton x:Name="DropDownToggleButton"
ClickMode="Press"
Focusable="false"
Foreground="{TemplateBinding BorderBrush}"
IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}"
Margin="2"
MinHeight="0"
MinWidth="0"
Width="Auto"/>
</Grid>
</Border>
<ControlTemplate.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsSelectionBoxHighlighted" Value="true"/>
<Condition Property="IsDropDownOpen" Value="false"/>
</MultiTrigger.Conditions>
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/>
</MultiTrigger>
<Trigger Property="IsSelectionBoxHighlighted" Value="true">
<Setter Property="Background" TargetName="SelectedItemBorder" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
</Trigger>
<Trigger Property="HasItems" Value="false">
<Setter Property="MinHeight" TargetName="DropDownBorder" Value="95"/>
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
<Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
</Trigger>
<Trigger Property="IsGrouping" Value="true">
<Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
</Trigger>
<Trigger Property="HasDropShadow" SourceName="PART_Popup" Value="true">
<Setter Property="Margin" TargetName="Shdw" Value="0,0,5,5"/>
</Trigger>
<Trigger Property="IsReadOnly" Value="True">
<Setter Property="Visibility" TargetName="DropDownToggleButton" Value="Collapsed"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsEditable" Value="true">
<Setter Property="IsTabStop" Value="false"/>
<Setter Property="Padding" Value="1"/>
<Setter Property="Template" Value="{StaticResource ComboBoxEditableTemplate}"/>
</Trigger>
</Style.Triggers>
</Style>
Zastosuj widok, który chcesz do Właściwości Tag ComboBox
<ComboBox ItemsSource={Binding Items}>
<ComboBox.ItemTemplate>
<DataTemplate>
<!-- Enter your item template shown as the selected item. -->
</DataTemplate>
</ComboBox.ItemTemplate>
<ComboBox.Tag>
<GridView>
<GridViewColumn DisplayMemberBinding="{Binding Name}"
Header="Name"
Width="100"/>
</GridView>
</ComboBox.Tag>
</ComboBox>
To wszystko.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-18 14:45:48
Podoba mi się odpowiedź H. B. , ale niestety, gdy jej używam, widzę błędy databinding w wyjściu dla właściwości nagłówka ComboBoxItem
HorizontalContentAlignment
i VerticalContentAlignment
:
Nie można znaleźć źródła dla powiązania z referencją ' RelativeSource FindAncestor, AncestorType= ' System.Okna.Sterowanie.ItemsControl", AncestorLevel= "1". BindingExpression: Path=HorizontalContentAlignment; DataItem = null; elementem docelowym jest ' ComboBoxItem '(Name="); target właściwość "Horizontalcontentalsignment" (type "horizontal")
Nie powodują one awarii programu, ale zaśmiecają wyjście i powodują zauważalne opóźnienia podczas uruchamiania kompilacji debugowania. Cokolwiek je powoduje, wydaje się być głęboko w wnętrznościach ComboBox
lub ComboBoxItem
; w każdym razie nie mogłem wymyślić żadnego sposobu, aby im zapobiec (ustawienie tych właściwości ręcznie lub za pomocą Style
nie pomogło). Więc skończyłem z lekką zmianą. To jest dłuższe i bardziej hakerskie niż lubię rzeczy być, ale to dostaje pracę zrobione:
<ComboBox Name="cb" Grid.IsSharedSizeScope="True" ItemsSource="{DynamicResource items}">
<ComboBox.Resources>
<!-- We'll use this dummy value to represent the header row. -->
<!-- The type and value are arbitrary; we just need a unique type -->
<!-- for DataTemplate selection to work with. -->
<system:Int32 x:Key="HeaderPlaceholder">-1</system:Int32>
<CompositeCollection x:Key="items">
<StaticResource ResourceKey="HeaderPlaceholder" />
<CollectionContainer Collection="{Binding Source={x:Reference cb},
Path=DataContext.Data}"/>
</CompositeCollection>
<!-- DataTemplate for the header item -->
<DataTemplate DataType="{x:Type system:Int32}">
<DataTemplate.Resources>
<!-- Make the TextBlocks black even though they are disabled -->
<Style TargetType="TextBlock">
<Style.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Foreground" Value="Black" />
</Trigger>
</Style.Triggers>
</Style>
</DataTemplate.Resources>
<StackPanel>
<Grid TextElement.FontWeight="Bold">
<Grid.ColumnDefinitions>
<ColumnDefinition SharedSizeGroup="A"/>
<ColumnDefinition Width="5"/>
<ColumnDefinition SharedSizeGroup="B"/>
</Grid.ColumnDefinitions>
<Grid.Children>
<TextBlock Grid.Column="0" Text="Name"/>
<TextBlock Grid.Column="2" Text="Occupation"/>
</Grid.Children>
</Grid>
<Separator />
</StackPanel>
</DataTemplate>
<!-- DataTemplate for a normal, selectable item -->
<DataTemplate DataType="{x:Type obj:Employee}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition SharedSizeGroup="A"/>
<ColumnDefinition Width="5"/>
<ColumnDefinition SharedSizeGroup="B"/>
</Grid.ColumnDefinitions>
<Grid.Children>
<TextBlock Grid.Column="0" Text="{Binding Name}"/>
<TextBlock Grid.Column="2" Text="{Binding Occupation}"/>
</Grid.Children>
</Grid>
</DataTemplate>
</ComboBox.Resources>
<ComboBox.ItemContainerStyle>
<!-- Make sure the header item is disabled so it can't be selected -->
<Style TargetType="ComboBoxItem">
<Style.Triggers>
<Trigger Property="DataContext" Value="{StaticResource HeaderPlaceholder}">
<Setter Property="IsEnabled" Value="False" />
</Trigger>
</Style.Triggers>
</Style>
</ComboBox.ItemContainerStyle>
</ComboBox>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:30