Применить стиль ItemTemplate к элементам ComboBox пользовательского элемента управления WPF, полученного из ComboBox - PullRequest
1 голос
/ 20 июня 2011

У меня есть WPF CustomControl, производный от ComboBox, и я пытаюсь выяснить, как настроить отображение элементов.По сути, я хочу, чтобы большинство элементов отображалось с обычным текстом, но, в зависимости от данных в каждом объекте, мне бы хотелось, чтобы некоторые элементы отображались либо жирным шрифтом, либо курсивом.Обычно я делаю это прямо в 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);

Кто-нибудь знает, как мне этого добиться?

1 Ответ

2 голосов
/ 20 июня 2011

Как насчет этого:

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 для вашего пользовательского элемента управления.

...