问题的创建样式设置为GroupStyle的一些组合框
本文关键字:GroupStyle 组合 创建 样式 设置 问题 | 更新日期: 2023-09-27 18:05:27
我试图实现以下代码,不同之处在于,我希望这适用于一种风格,这样我就可以为任何我喜欢的ComboBox
设置它(即,由于特定的不可更改的要求,我正在从后面的代码动态地创建许多组合框,并希望将GroupStyles
添加到每一个)。
我对WPF
和XAML
比较陌生,所以我想通过Style
并在ControlTemplate
中指定GroupStyles
,然后将样式应用于各自的ComboBoxes
。这是我到目前为止所尝试的,但代码将无法编译(主要是由于<ComboBox.GroupStyle>
部分)。
<Style x:Name="valuesComboStyle" TargetType="ComboBox">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<ComboBox.GroupStyle>
<GroupStyle>
<GroupStyle.HeaderTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}"/>
</DataTemplate>
</GroupStyle.HeaderTemplate>
</GroupStyle>
</ComboBox.GroupStyle>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
在资源中的某处定义DataTemple
。并将其用于您需要的每个Combobox
。
代码如下:
<Grid>
<Grid.Resources>
<DataTemplate x:Key="groupStyle">
<TextBlock FontWeight="Bold" Text="{Binding Name}"/>
</DataTemplate>
<Style TargetType="{x:Type ComboBoxItem}" x:Key="comboBoxItemStyle">
<Setter Property="Template" >
<Setter.Value>
<ControlTemplate>
<Label Background="Red" Content="{Binding Item}"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Grid.Resources>
<ComboBox Height="27" Width="195" DisplayMemberPath="Item" Name="cboGroup"
ItemContainerStyle="{StaticResource comboBoxItemStyle}">
<ComboBox.GroupStyle>
<GroupStyle HeaderTemplate="{StaticResource groupStyle}"/>
</ComboBox.GroupStyle>
</ComboBox>
</Grid>
编辑:我创建了一个新的组合框,设置了一些项目,并设置了你正在寻找的样式。(我更新了你链接中的代码)
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = this;
ComboBox comboBox1 = new ComboBox();
comboBox1.Height = 23;
comboBox1.Width = 200;
GroupStyle style = new GroupStyle();
style.HeaderTemplate = (DataTemplate)this.FindResource("groupStyle");
comboBox1.GroupStyle.Add(style);
comboBox1.DisplayMemberPath = "Item";
ObservableCollection<CategoryItem<string>> items = new ObservableCollection<CategoryItem<string>>();
items.Add(new CategoryItem<string> { Category = "Warm Colors", Item = "Orange" });
items.Add(new CategoryItem<string> { Category = "Warm Colors", Item = "Red" });
items.Add(new CategoryItem<string> { Category = "Warm Colors", Item = "Pink" });
items.Add(new CategoryItem<string> { Category = "Cool Colors", Item = "Blue" });
items.Add(new CategoryItem<string> { Category = "Cool Colors", Item = "Purple" });
items.Add(new CategoryItem<string> { Category = "Cool Colors", Item = "Green" });
CollectionViewSource cvs = new CollectionViewSource();
cvs.GroupDescriptions.Add(new PropertyGroupDescription("Category"));
cvs.Source = items;
Binding b = new Binding();
b.Source = cvs;
BindingOperations.SetBinding(
comboBox1, ComboBox.ItemsSourceProperty, b);
myGrid.Children.Add(comboBox1);
}
}
public class CategoryItem<T>
{
public T Item { get; set; }
public string Category { get; set; }
}
GroupStyle
属性是在组合框上,所以你需要单独设置它,而不是在模板中-
<Style TargetType="ComboBox">
<Setter Property="GroupStyle">
<Setter.Value>
<GroupStyle>
<GroupStyle.HeaderTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}"/>
</DataTemplate>
</GroupStyle.HeaderTemplate>
</GroupStyle>
</Setter.Value>
</Setter>
</Style>
编辑
嗯,你不能从Style
设置GroupStyle
属性,因为它没有任何与之相关的setter。
你可以像这里解释的那样使用Add()
方法从代码后面添加它,或者你必须创建自定义的Attached property
。
背后的代码-
GroupStyle g = new GroupStyle();
//Create header template
FrameworkElementFactory control = new
FrameworkElementFactory(typeof(TextBlock));
Binding binding = new Binding();
control.SetBinding(TextBlock.TextProperty, binding);
binding.Path = new PropertyPath("Name");
DataTemplate dataTemplate = new DataTemplate();
dataTemplate.VisualTree = control;
g.HeaderTemplate = dataTemplate;
ComboBox cmb = new ComboBox();
cmb.GroupStyle.Add(g);