2009-05-03 6 views
0

У меня есть ComboBox, основанный на данных XML файла:WPF: ComboBoxItem фон

<Root> 
<Node Background="Yellow" Foreground="Cyan" Image="1.ico" Property="aaaa" Value="28" /> 
<Node Background="SlateBlue" Foreground="Black" Image="2.ico" Property="bbbb" Value="2.5" /> 
<Node Background="Teal" Foreground="Green" Image="3.ico" Property="cccc" Value="4.0" /> 
<Node Background="Yellow" Foreground="Red" Image="4.ico" Property="dddd" Value="0" /></Root> 

Таким образом, в данном случае, мне нужно создать соединение ComboBoxItem, когда каждый элемент имеет подходящий фон.

Я пытался сделать что-то вроде этого:

<UserControl.Resources> 
    <DataTemplate DataType="Node"> 
     <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="Auto" MinWidth="20"/> 
       <ColumnDefinition Width="*"/> 
       <ColumnDefinition Width="Auto" MinWidth="20"/> 
      </Grid.ColumnDefinitions> 
      <Border Background="{Binding [email protected]}" Grid.Column="0"> 
       <Image Source="{Binding [email protected]}" 
         Width="16" 
         Height="16" 
         Margin="3" /> 
      </Border> 
      <Border Background="{Binding [email protected]}" Grid.Column="1"> 
       <TextBlock Foreground="{Binding [email protected]}" 
          Margin="3" 
          Text="{Binding [email protected]}" /> 
      </Border> 
      <Border Background="{Binding [email protected]}" Grid.Column="2"> 
       <TextBlock Foreground="{Binding [email protected]}" 
          Margin="3" 
          FontWeight="Bold" 
          Text="{Binding [email protected]}" /> 
      </Border> 
     </Grid> 
    </DataTemplate> 

    <XmlDataProvider x:Key="xmlNodeList" 
        Source="/data/Combo.xml" 
        XPath="/Root/Node"/> 
</UserControl.Resources> 

<ComboBox Name="myComboBox" 
      ItemsSource="{Binding Source={StaticResource xmlNodeList}}" 
      SelectedIndex="0" /> 

, но это не выглядит хорошо :-(

Какое решение вы рекомендуете

Заранее спасибо

ответ

1

Одна вещь?! заключается в том, что вы забыли указать, какой шаблон использовать:

<DataTemplate x:Key="Node"> 
     <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="Auto" MinWidth="20"/> 
      <ColumnDefinition Width="*"/> 
      <ColumnDefinition Width="Auto" MinWidth="20"/> 
     </Grid.ColumnDefinitions> 
     <Border Background="{Binding [email protected]}" Grid.Column="0"> 
      <Image Source="{Binding [email protected]}" 
        Width="16" 
        Height="16" 
        Margin="3" /> 
     </Border> 
     <Border Background="{Binding [email protected]}" Grid.Column="1"> 
      <TextBlock Foreground="{Binding [email protected]}" 
         Margin="3" 
         Text="{Binding [email protected]}" /> 
     </Border> 
     <Border Background="{Binding [email protected]}" Grid.Column="2"> 
      <TextBlock Foreground="{Binding [email protected]}" 
         Margin="3" 
         FontWeight="Bold" 
         Text="{Binding [email protected]}" /> 
     </Border> 
    </Grid> 
</DataTemplate> 

И тогда ваш ComboBox:

<ComboBox Name="myComboBox" 
      ItemsSource="{Binding Source={StaticResource xmlNodeList}}" 
      ItemTemplate="{StaticResource Node}" 
      SelectedIndex="0" /> 

Система «DATATYPE» работает с типизированным объектом, я не уверен, что вы можете заставить его работать с данными в формате XML. Это сработает.

Обновление: Прежде чем спросить, вы должны также определить стиль для элементов, так что они бухтой ширину списка, в противном случае ваши столбцы будут неравномерно:

<ComboBox Name="myComboBox" 
         ItemsSource="{Binding Source={StaticResource xmlNodeList}}" 
         ItemTemplate="{StaticResource Node}" 
         SelectedIndex="0"> 
       <ComboBox.ItemContainerStyle> 
        <Style TargetType="{x:Type ComboBoxItem}"> 
         <Setter Property="HorizontalContentAlignment" 
           Value="Stretch" /> 
        </Style> 
       </ComboBox.ItemContainerStyle> 
      </ComboBox> 

Это будет растягивать отдельные элементы для охвата всей ширины списка.

+0

Hello Denis, Благодарим за отзыв! Я попробовал свои предложения, но: 1. ItemTemplate = "{StaticResource Node}" генерирует ошибку во время выполнения: Не удается найти метод() ресурс с именем '{Node}' в InitializeComponent 2. Добавлен стиль ничего не изменилось 3. Одна из проблем, возникающих при наведении мыши на ComboboxItems, выделяется под Grid – user83493

+0

. Обратите внимание на мое замечание, в котором говорится, что вам нужно указать ax: Key = «Node», а не DataType = «Node» на ваш DataTemplate. Это источник ошибки. –

+0

Я обновил свой ответ, чтобы включить полный шаблон, я понятнее. –