2012-01-05 16 views
9

Tengo una aplicación WPF muy simple que muestra un ComboBox que se une a una lista de clases que representan personas. Cada objeto 'Persona' tiene un campo de cadena Nombre y una enumeración Sexo. Me gustaría que el ComboBox muestre un menú desplegable del campo Nombre de varias personas, pero para cada línea que se diseñará de acuerdo con el campo Sexo, por ejemplo, azul para los hombres, rosa para las mujeres. ¿Alguien puede decirme qué estoy haciendo mal?Estilo Elementos WPF ComboBox

Aquí es el XML:

<Window x:Class="ComboBoxColour.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <StackPanel Orientation="Vertical"> 
     <ComboBox ItemsSource="{Binding People}" Width="100" Height="20"> 
      <ComboBox.ItemTemplate> 
       <DataTemplate> 
        <TextBlock Name="somePerson" Text="{Binding Path=Name}">       
         <TextBlock.Triggers> 
          <DataTrigger Binding="{Binding Path=Sex}" Value="Male"> 
           <DataTrigger.Setters> 
            <Setter Property="Foreground" Value="Blue" TargetName="somePerson" /> 
           </DataTrigger.Setters> 
          </DataTrigger> 
         </TextBlock.Triggers>       
        </TextBlock> 
       </DataTemplate> 
      </ComboBox.ItemTemplate> 
     </ComboBox> 
    </StackPanel> 
</Window> 

Y aquí es el C#:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 
using System.Collections.ObjectModel; 

namespace ComboBoxColour 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
    public List<Person> people; 
    public List<Person> People 
    { 
     get { return people; } 
     set { people = value; } 
    } 

    public MainWindow() 
    { 
     this.DataContext = this; 

     People = new List<Person>(); 
     People.Add(new Person("Alice", SexEnum.Female)); 
     People.Add(new Person("Bob", SexEnum.Male)); 
     People.Add(new Person("Claire", SexEnum.Female)); 
     People.Add(new Person("Daniel", SexEnum.Male)); 

     InitializeComponent(); 
    } 
    } 

    public enum SexEnum{Male,Female}; 

    public class Person 
    { 
    private string name; 
    public string Name 
    { 
     get { return name; } 
     set { name = value; } 
    } 

    private SexEnum sex; 
    public SexEnum Sex 
    { 
     get { return sex; } 
     set { sex = value; } 
    } 

    public Person(string Name, SexEnum Sex) 
    { 
     this.Name = Name; 
     this.Sex = Sex; 
    } 
    } 
} 

Muchas gracias de antemano

Respuesta

15

Debe utilizar "estilo" en lugar de "disparadores TextBlock.Triggers "

utilizar este XAML:

<Window x:Class="ComboBoxColour.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <StackPanel Orientation="Vertical"> 
     <ComboBox ItemsSource="{Binding People}" Width="100" Height="20"> 
      <ComboBox.ItemTemplate> 
       <DataTemplate> 
        <TextBlock Name="somePerson" Text="{Binding Path=Name}"> 
         <TextBlock.Style> 
          <Style TargetType="TextBlock"> 
           <Style.Triggers> 
            <DataTrigger Binding="{Binding Path=Sex}" Value="Male"> 
             <DataTrigger.Setters> 
              <Setter Property="Foreground" Value="blue"/> 
             </DataTrigger.Setters> 
            </DataTrigger> 
            <DataTrigger Binding="{Binding Path=Sex}" Value="Female"> 
             <DataTrigger.Setters> 
              <Setter Property="Foreground" Value="Pink"/> 
             </DataTrigger.Setters> 
            </DataTrigger> 
           </Style.Triggers> 
          </Style> 
         </TextBlock.Style> 
        </TextBlock> 
       </DataTemplate> 
      </ComboBox.ItemTemplate> 
     </ComboBox> 
    </StackPanel> 
</Window> 

Ahora tendrá azul para hombre y rosa para mujer.

18

Uso ItemContainerStyle en lugar de ItemTemplate:

<ComboBox ItemsSource="{Binding People}" Width="100" Height="20"> 
     <ComboBox.ItemContainerStyle> 
      <Style TargetType="ComboBoxItem"> 
       <Setter Property="Foreground" Value="Pink" /> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding Path=Sex}" Value="Male"> 
         <Setter Property="Foreground" Value="Blue" /> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </ComboBox.ItemContainerStyle> 
    </ComboBox>