2012-01-05 29 views
9

Tôi có một ứng dụng WPF rất đơn giản hiển thị một ComboBox liên kết với một danh sách các lớp đại diện cho mọi người. Mỗi đối tượng 'Person' có một trường Name string và một enum Sex. Tôi muốn ComboBox hiển thị một danh sách thả xuống của trường Tên người khác nhau, nhưng đối với mỗi dòng được tạo kiểu theo trường Giới tính, ví dụ: màu xanh dương cho nam, màu hồng cho nữ. Bất cứ ai có thể cho tôi biết những gì tôi đang làm sai?Tạo kiểu WPF Các mục ComboBox

Đây là 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> 

Và đây là 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; 
    } 
    } 
} 

Nhiều cảm ơn trước

Trả lời

15

Bạn nên sử dụng "Style" gây nên thay vì "TextBlock.Triggers "

sử dụng XAML này:

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

Bây giờ bạn sẽ có màu xanh dương cho nam và hồng cho nữ.

18

Sử dụng ItemContainerStyle thay vì 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>