silverlight combobox itemtemplate binding

时间:2016-10-16 16:18:24

标签: c# silverlight combobox datatemplate itemtemplate

我想在Silverlight ComboBox中显示图像和文本。我在WPF中找到了一个示例,其中ItemTemplate按图像和名称显示颜色。 在Silverlight中,相同的xml会产生空行。因此,对于每个项目都生成了一个项目,它只是没有绑定到Name属性。 Silverlight是否需要其他绑定而不是WPF?

这是样本:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        cmbColors.ItemsSource = typeof(Colors).GetProperties();
    }
}

XML

<UserControl x:Class="SilverlightColors.MainPage"
    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"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400">

    <Grid x:Name="LayoutRoot" Background="White">
        <StackPanel >
            <ComboBox Name="cmbColors" >
                <ComboBox.ItemTemplate  >
                    <DataTemplate  >
                        <StackPanel Orientation="Horizontal">
                            <Rectangle Fill="{Binding Name}" Width="16" Height="16" Margin="0,2,5,2"/>
                            <TextBlock Text="{Binding Name}"/>
                        </StackPanel>
                    </DataTemplate>
                </ComboBox.ItemTemplate>
            </ComboBox>
        </StackPanel>
    </Grid>
</UserControl>

1 个答案:

答案 0 :(得分:0)

尝试通过绑定Fill的名称来设置Rectangle的{​​{1}}将不起作用。 XAML做了一些特别的魔术:

Color

上班。因此,当从GetProperties()返回的<Rectangle Fill="White" Width="16" Height="16" Margin="0,2,5,2"/> 的“名称”属性为“黑色”,“白色”或“黄色”时,您无法直接使用它。您需要做的是创建一个名称和画笔字典,并为每个字符分配不同的颜色,然后将组合框的DataSource绑定到该字典。

此代码有效:

的.cs:

PropertyInfo

XAML:

var list = typeof(Colors).GetProperties();
var brushes = new Dictionary<string, SolidColorBrush>();
foreach (var colour in list)
{
    brushes.Add(colour.Name, new SolidColorBrush((Color)colour.GetValue(colour, null)));
}
cmbColors.ItemsSource = brushes;