如何将数据绑定到ComboBox并重写项目模板?

时间:2019-04-02 08:09:15

标签: wpf

我想制作一个类似于photoshop的组合框,以显示计算机中的所有字体并将其显示。

enter image description here

我应该显示字体名称,字体示例,所以我必须重写项目的样式。

我这样写代码:

<ItemsControl Grid.Column="1" Margin="10,10,0,10">
                        <ItemsControl.ItemsPanel>
                            <ItemsPanelTemplate>
                                <ComboBox></ComboBox>
                            </ItemsPanelTemplate>
                        </ItemsControl.ItemsPanel>
                    </ItemsControl>

但是Visual Studio报告错误: enter image description here

我该如何解决它并自行定制组合框?谢谢。

1 个答案:

答案 0 :(得分:1)

一个简单的示例。根据所有者的评论进行编辑。

XAML

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <ComboBox Width="200" VerticalAlignment="Center"
              HorizontalContentAlignment="Stretch"
              ItemsSource="{x:Static Fonts.SystemFontFamilies}">
        <ComboBox.Resources>
            <local:GetFamilyName x:Key="getName"/>
        </ComboBox.Resources>
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <DockPanel>
                    <TextBlock Text="{Binding Converter={StaticResource getName}}"/>
                    <TextBlock Text="Sample" TextAlignment="Right"
                               FontFamily="{Binding}"/>
                </DockPanel>
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>
    </Grid>
</Window>

转换器代码

namespace WpfApp1
{
    public class GetName : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return (value as FontFamily)?.FamilyNames.Values.First();
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return null;
        }
    }
}