2012-01-05 40 views
9

人を表すクラスのリストにバインドするComboBoxを表示する非常に単純なWPFアプリケーションがあります。各 'Person'オブジェクトには、Name文字列フィールドと、Sex enumがあります。私はComboBoxにさまざまな人の名前フィールドのドロップダウンを表示するが、各行については、性別フィールドに応じてスタイルを設定する(たとえば、男性は青、女性はピンク)。誰かが私が間違っていることを教えてもらえますか?ここでWPF ComboBoxアイテムのスタイル設定

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

そしてここでは、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; 
    } 
    } 
} 

多くのおかげで、事前に

答えて

15

あなたは "スタイル" を使用する必要がありますトリガの代わりに「TextBlock.Triggers

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

ここでは、女性の場合は男性は青、女性の場合はピンクです。

18

代わりItemTemplateの使用ItemContainerStyle

<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> 
関連する問題