WPF 一种带有多个子集的类ComBox 解决方法
2021-02-05 05:16
标签:one add button 其他 pen nbsp format pop tor 在最近的工作中遇到很多,类似这种layUI风格的Combox: 因为WPF原本的控件,并不具备这种功能,尝试重写Combox的模板,发现无从下手。 于是尝试从多个控件组合来实现这个功能。 这里使用了Popup 来存放数据,发现还不错。 将popup分为三列,每个列的列宽设置位自动,当点击其中一个选项的时候,检索所选,根据字典查到数据,再加载其他列。 即可实现这种效果 代码如下: UI: Model: ViewModel: WPF 一种带有多个子集的类ComBox 解决方法 标签:one add button 其他 pen nbsp format pop tor 原文地址:https://www.cnblogs.com/ganbei/p/14363577.htmlButton x:Name="btn1"
Height="54"
Margin="0,10,0,0"
Click="Button_Click">
Button.Template>
ControlTemplate TargetType="{x:Type Button}">
Border
Background="Transparent"
CornerRadius="15"
BorderBrush="#6B778D"
BorderThickness="1">
Grid>
TextBlock
Text="▼"
Margin="0,0,5,0"
HorizontalAlignment="Right"
VerticalAlignment="Center"
Foreground="White"
FontSize="20" />
TextBlock
Text="{Binding Shell6PageModel.DetailedAddress}"
Margin="10,0,0,0"
VerticalAlignment="Center"
Foreground="White"
FontSize="32" />
Grid>
Border>
ControlTemplate>
Button.Template>
Button>
Popup x:Name="pop1"
Width="{Binding ElementName=btn1, Path=ActualWidth}"
Height="260"
AllowsTransparency="True"
IsOpen="False"
Placement="Bottom"
PlacementTarget="{Binding ElementName=btn1}"
PopupAnimation="Slide"
StaysOpen="False">
Grid>
Border
Background="Gray"
Opacity="0.9"
BorderBrush="Gray"
BorderThickness="1"
CornerRadius="8" />
Border>
Grid HorizontalAlignment="Center">
Grid>
Grid.ColumnDefinitions>
ColumnDefinition Width="Auto" />
ColumnDefinition Width="Auto" />
ColumnDefinition Width="Auto" />
ColumnDefinition Width="Auto" />
Grid.ColumnDefinitions>
Grid Grid.Column="0">
ListBox
ItemsSource="{Binding Countries}"
ScrollViewer.VerticalScrollBarVisibility="Hidden"
BorderThickness="0">
ListBox.ItemContainerStyle>
Style TargetType="ListBoxItem">
Setter Property="HorizontalAlignment" Value="Stretch" />
Setter Property="Template">
Setter.Value>
ControlTemplate TargetType="{x:Type ListBoxItem}">
Grid>
Border x:Name="bord1" />
ContentPresenter />
Grid>
ControlTemplate.Triggers>
Trigger Property="IsSelected" Value="True">
Setter TargetName="bord1" Property="Background" Value="Transparent" />
Trigger>
ControlTemplate.Triggers>
ControlTemplate>
Setter.Value>
Setter>
Style>
ListBox.ItemContainerStyle>
ListBox.ItemTemplate>
DataTemplate>
RadioButton
Content="{Binding DetailedCountry}"
Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:Shell6Page}}, Path=DataContext.countryCommand}"
CommandParameter="{Binding}"
Width="100"
Height="35"
Margin="0,5,0,5"
VerticalAlignment="Center"
Foreground="White"
FontSize="36"
GroupName="0" />
DataTemplate>
ListBox.ItemTemplate>
ListBox>
Grid>
Grid Grid.Column="1">
ListBox
ItemsSource="{Binding Shengs}"
ScrollViewer.VerticalScrollBarVisibility="Hidden"
BorderThickness="0">
ListBox.ItemContainerStyle>
Style TargetType="ListBoxItem">
Setter Property="HorizontalAlignment" Value="Stretch" />
Setter Property="Template">
Setter.Value>
ControlTemplate TargetType="{x:Type ListBoxItem}">
Grid>
Border x:Name="bord1" />
ContentPresenter VerticalAlignment="Center" />
Grid>
ControlTemplate.Triggers>
Trigger Property="IsSelected" Value="True">
Setter TargetName="bord1" Property="Background" Value="Transparent" />
Trigger>
ControlTemplate.Triggers>
ControlTemplate>
Setter.Value>
Setter>
Style>
ListBox.ItemContainerStyle>
ListBox.ItemTemplate>
DataTemplate>
RadioButton
Content="{Binding DetailedSheng}"
Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:Shell6Page}}, Path=DataContext.shengCommand}"
CommandParameter="{Binding}"
Width="100"
Height="35"
Margin="0,5,0,5"
VerticalAlignment="Center"
Foreground="White"
FontSize="36"
GroupName="1" />
DataTemplate>
ListBox.ItemTemplate>
ListBox>
Grid>
Grid Grid.Column="2">
ListBox
ItemsSource="{Binding Cities}"
ScrollViewer.VerticalScrollBarVisibility="Hidden"
BorderThickness="0">
ListBox.ItemContainerStyle>
Style TargetType="ListBoxItem">
Setter Property="HorizontalAlignment" Value="Stretch" />
Setter Property="Template">
Setter.Value>
ControlTemplate TargetType="{x:Type ListBoxItem}">
Grid>
Border x:Name="bord1" />
ContentPresenter />
Grid>
ControlTemplate.Triggers>
Trigger Property="IsSelected" Value="True">
Setter TargetName="bord1" Property="Background" Value="Transparent" />
Trigger>
ControlTemplate.Triggers>
ControlTemplate>
Setter.Value>
Setter>
Style>
ListBox.ItemContainerStyle>
ListBox.ItemTemplate>
DataTemplate>
RadioButton
Content="{Binding DetailedCity}"
Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:Shell6Page}}, Path=DataContext.cityCommand}"
CommandParameter="{Binding}"
Width="100"
Height="35"
Margin="0,5,0,5"
VerticalAlignment="Center"
Foreground="White"
FontSize="36"
GroupName="2" />
DataTemplate>
ListBox.ItemTemplate>
ListBox>
Grid>
Grid Grid.Column="3">
ListBox
ItemsSource="{Binding Areas}"
ScrollViewer.VerticalScrollBarVisibility="Hidden"
BorderThickness="0">
ListBox.ItemContainerStyle>
Style TargetType="ListBoxItem">
Setter Property="HorizontalAlignment" Value="Stretch" />
Setter Property="Template">
Setter.Value>
ControlTemplate TargetType="{x:Type ListBoxItem}">
Grid>
Border x:Name="bord1" />
ContentPresenter />
Grid>
ControlTemplate.Triggers>
Trigger Property="IsSelected" Value="True">
Setter TargetName="bord1" Property="Background" Value="Transparent" />
Trigger>
ControlTemplate.Triggers>
ControlTemplate>
Setter.Value>
Setter>
Style>
ListBox.ItemContainerStyle>
ListBox.ItemTemplate>
DataTemplate>
RadioButton
Content="{Binding DetailedArea}"
Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:Shell6Page}}, Path=DataContext.areaCommand}"
CommandParameter="{Binding}"
Width="100"
Height="35"
Margin="0,5,0,5"
Foreground="White"
FontSize="36"
Click="RadioButton_Click"
GroupName="3" />
DataTemplate>
ListBox.ItemTemplate>
ListBox>
Grid>
Grid>
Grid>
Border>
Grid>
Popup>
public class Shell6PageModel:ViewModelBase
{
private string detailedAddress;
///
public class Shell6PageViewModel : ViewModelBase
{
Dictionarystring, string> AddressCity = new Dictionarystring, string>();
Dictionarystring, string> AddressArea = new Dictionarystring, string>();
Dictionarystring, string> AddressSheng = new Dictionarystring, string>();
Dictionarystring, string> AddressCountry = new Dictionarystring, string>();
string[] ad;
public Shell6PageViewModel()
{
countryCommand = new RelayCommand
文章标题:WPF 一种带有多个子集的类ComBox 解决方法
文章链接:http://soscw.com/index.php/essay/51192.html