WPF ComboBox用DataTemplate和CodeBehind选择Font

时间:2015-08-14 17:18:08

标签: wpf binding combobox datatemplate code-behind

我需要编写一个显示字体的comboBox,每个字体都是程式化的。如此图片:

enter image description here

我不得不通过代码隐藏来实现它,而不是xaml。

我的xaml代码:

 public View getView(int position, View conver, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        if (convertView == null) {

            convertView = inflater.inflate(R.layout.ac_layout, null);
        }
            ImageView icon = (ImageView) convertView.findViewById(R.id.venue_image);
            icon.setImageResource(sportsMap.get(sportList.get(position).getId()));
            TextView venueName = (TextView) convertView.findViewById(R.id.venue_name);
            //Toast.makeText(context,venueList.get(position).getVenueName(),Toast.LENGTH_SHORT ).show();
            venueName.setText(sportList.get(position).getDisplayName());
            TextView Place = (TextView)convertView.findViewById(R.id.place);
            Place.setText("sad");

        return convertView;
    }

和c#:

<Window x:Class="_08_Binding_DataTemplate_CodeBehind.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="200" Width="200">
<Grid>
    <ComboBox x:Name="lstFonts" HorizontalAlignment="Stretch" VerticalAlignment="Top" />
</Grid>

我尝试过很多变种,但都没有成功。我猜绑定失败但不知道如何解决它。 我得到的最多的东西已经与选定的来源相关联,但随后更改了列表中的所有元素,如下图所示。

enter image description here

我不知道如何对这个绑定进行编程,以便列表中的每个项目都能引用自己。

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

在XAML上执行此操作非常简单,请尝试以下操作,

XAML

<ComboBox x:Name="lstFonts" ItemsSource="{x:StaticFonts.SystemFontFamilies}" HorizontalAlignment="Stretch" VerticalAlignment="Top" ItemTemplate="{StaticResource item}" >
  <ComboBox.Resources>
    <DataTemplate>
            <TextBlock Text="{Binding }" FontFamily="{Binding }"/>    
    </DataTemplate>
 </ComboBox.Resources>
<ComboBox>

答案 1 :(得分:0)

我可以通过加载xaml标记来实现,但我想只使用C#代码对其进行编程,而不使用xaml标记。感谢。

    public MainWindow()
    {
        InitializeComponent();

        CollectionViewSource c = new CollectionViewSource();
        c.Source = Fonts.SystemFontFamilies;
        c.SortDescriptions.Add(new SortDescription("Source", ListSortDirection.Ascending));

        lstFonts.ItemsSource = c.View;
        lstFonts.ItemTemplate = getDataTemplateFromXAML();
    }

    private DataTemplate getDataTemplateFromXAML()
    {
        StringBuilder sb = new StringBuilder();

        sb.Append("<DataTemplate xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">");
        sb.Append("<StackPanel VirtualizingStackPanel.IsVirtualizing=\"True\">");
        sb.Append("<TextBlock Text=\"{Binding }\" FontFamily=\"{Binding }\"/>");
        sb.Append("</StackPanel>");
        sb.Append("</DataTemplate>");

        StringReader sr = new StringReader(sb.ToString());
        XmlReader xr = XmlReader.Create(sr);

        DataTemplate retVal = XamlReader.Load(xr) as DataTemplate;
        return retVal;
    }