将ItemTemplate样式应用于从ComboBox派生的WPF CustomControl的ComboBox项

时间:2011-06-20 13:37:45

标签: wpf combobox formatting styles itemtemplate

我有一个源自ComboBox的WPF CustomControl,我正在试图弄清楚如何自定义项目的显示。基本上,我希望大多数项目用普通文本显示,但是, 根据每个项目对象中的数据,我想要一些显示粗体或斜体。通常我直接在XAML中这样做,但由于它是一个CustomControl,我有点不知所措。我希望能够直接在代码中绑定它,但我也愿意接受可能意味着加载外部XAML样式的方法,如果你能告诉我如何做到这一点(我没有线索)。< / p>

下面的代码是我正在使用的控件的基本近似,但大大简化了。但是,加载数据的方式基本相同,数据对象本身来自外部源,因此无论如何都无法访问控件本身。模板需要 只是被基本属性束缚。

public class FormatData
{
    public FormatData() { }
    public string Name { get; set; }
    public bool Bold { get; set; }
    public bool Italic { get; set; }
}

public class FormatDropDown : System.Windows.Controls.ComboBox
{
    public FormatDropDown()
    {
    }

    public void LoadSelection(FormatData[] data)
    {
        try
        {
            this.ItemsSource = data;
            this.DisplayMemberPath = "Name";
        }
        catch (Exception e) { MessageBox.Show(e.Message); ; }
    }
}

控件填充如下:

        var data = new FormatData[]{
            new FormatData(){
                Name = "Normal"
            },
            new FormatData(){
                Name = "Bold",
                Bold = true
            },
            new FormatData(){
                Name = "Italic",
                Italic = true
            },
            new FormatData(){
                Name = "BoldItalic",
                Bold = true,
                Italic = true
            },
        };

        fddTest.LoadSelection(data);

任何人都知道如何实现这一目标?

1 个答案:

答案 0 :(得分:2)

这个怎么样:

public class FormatDropDown : System.Windows.Controls.ComboBox {
    static FormatDropDown() {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(FormatDropDown), new FrameworkPropertyMetadata(typeof(FormatDropDown)));
    }

    public void LoadSelection(FormatData[] data) {
        try {
            this.ItemsSource = data;
            this.DisplayMemberPath = "Name";
        } catch (Exception e) { MessageBox.Show(e.Message); ; }
    }
}

在主题文件(generic.xaml)中:

<Style TargetType="{x:Type local:FormatDropDown}" BasedOn="{StaticResource {x:Type ComboBox}}">
    <Setter Property="ItemContainerStyle">
        <Setter.Value>
            <Style TargetType="ComboBoxItem">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Bold}" Value="True">
                        <Setter Property="FontWeight" Value="Bold" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding Italic}" Value="True">
                        <Setter Property="FontStyle" Value="Italic" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Setter.Value>
    </Setter>
</Style>

所以基本上覆盖自定义控件的DefaultStyleKey。