问题的创建样式设置为GroupStyle的一些组合框

本文关键字:GroupStyle 组合 创建 样式 设置 问题 | 更新日期: 2023-09-27 18:05:27

我试图实现以下代码,不同之处在于,我希望这适用于一种风格,这样我就可以为任何我喜欢的ComboBox设置它(即,由于特定的不可更改的要求,我正在从后面的代码动态地创建许多组合框,并希望将GroupStyles添加到每一个)。

我对WPFXAML比较陌生,所以我想通过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>

问题的创建样式设置为GroupStyle的一些组合框

在资源中的某处定义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);