【问题标题】:Apply ItemTemplate Style to ComboBox items of a WPF CustomControl derived from ComboBox将 ItemTemplate 样式应用于从 ComboBox 派生的 WPF CustomControl 的 ComboBox 项
【发布时间】:2011-09-18 17:10:32
【问题描述】:

我有一个派生自 ComboBox 的 WPF CustomControl,我正在尝试弄清楚如何自定义项目的显示。基本上,我希望大多数项目以普通文本显示,但是, 根据每个项目对象中的数据,我希望一些显示粗体或斜体。通常我直接在 XAML 中执行此操作,但由于它是 CustomControl,我有点不知所措。我希望能够直接在代码中绑定它,但我也对可能意味着加载外部 XAML 样式的方法持开放态度,如果你能告诉我如何做到这一点(我不知道)。

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

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);

有人知道我如何实现这一目标吗?

【问题讨论】:

    标签: wpf combobox formatting styles itemtemplate


    【解决方案1】:

    这个怎么样:

    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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-25
      • 1970-01-01
      • 1970-01-01
      • 2020-04-05
      • 2018-06-07
      • 1970-01-01
      • 2014-11-11
      • 2019-07-11
      相关资源
      最近更新 更多