2016-10-16 2 views
0

Я хочу отобразить изображение и текст в Silverlight ComboBox. Я нашел пример в WPF с ItemTemplate, показывающим цвета по изображению и имени. В Silverlight тот же xml приводит к пустым строкам. Поэтому для каждого элемента создается сгенерированный элемент, он просто не привязывается к свойству Name. Требуется ли Silverlight другое связывание, чем WPF?silverlight combobox itemtemplate binding

Это образец:

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> 

ответ

0

Попытка установить Fill в виде Rectangle путем связывания с именем Color не будет работать. XAML делает некоторую специальную магию:

<Rectangle Fill="White" Width="16" Height="16" Margin="0,2,5,2"/> 

для работы. Таким образом, хотя свойство «Имя» PropertyInfo, которое возвращается из GetProperties(), является «черным», «белым» или «желтым», вы не можете использовать его напрямую. Что вам нужно сделать, так это создать словарь имен и кистей и назначить каждому другой цвет, а затем привязать к нему DataSource вашего combobox.

Этот код работает:

.cs:

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; 

XAML:

<ComboBox Name="cmbColors" 
      VerticalAlignment="Center" 
      HorizontalAlignment="Center"> 
    <ComboBox.ItemTemplate > 
     <DataTemplate > 
      <StackPanel Orientation="Horizontal"> 
       <Rectangle Fill="{Binding Value}" Width="16" Height="16" Margin="0,2,5,2"/> 
       <TextBlock Text="{Binding Key}"/> 
      </StackPanel> 
     </DataTemplate> 
    </ComboBox.ItemTemplate> 
</ComboBox> 
Смежные вопросы