Примените ItemTemplate Style к элементам ComboBox пользовательского элемента управления WPF, полученного из ComboBox
У меня есть 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 ответ
Как насчет этого:
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 для вашего пользовательского элемента управления.