2012-01-05 21 views
9

İnsanları temsil eden sınıfların listesine bağlanan bir ComboBox görüntüleyen çok basit bir WPF uygulamasına sahibim. Her 'Kişi' nesnesinin bir İsim dizesi alanı ve bir Seks enum'u vardır. ComboBox'ın çeşitli insanların isim alanlarının bir açılır kapanmasını göstermesini isterim, ancak her satırın Sex alanına göre, örneğin erkekler için mavi, kadınlar için pembe renkte olması gerekir. Bana yanlış ne yaptığımı söyleyen var mı? İşte Stil WPF ComboBox öğeleri

XML'dir:

<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> 

Ve burada C# geçerli: önceden

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; 
    } 
    } 
} 

çok teşekkürler Sen kullanmalıdır

cevap

15

"Stil" "TextBlock.Triggers yerine tetikler "

this 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> 

Şimdi kadın için erkek ve pembeler için mavi olacak.

18

Kullanım ItemContainerStyle yerine ItemTemplate ait:

<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>