2011-06-20 3 views
1

ComboBoxから派生したWPF CustomControlがあり、項目の表示をカスタマイズする方法を理解しようとしています。基本的には、ほとんどのアイテムは通常のテキストで表示されますが、各アイテムオブジェクトのデータによっては になります。太字または斜体のいずれかを表示するものがあります。通常、私はこれをXAMLで直接行いますが、CustomControlなので、私は少し犠牲になります。私はコード内で直接バインドすることができればと思っていますが、私はそれを行う方法を私に示すことができれば(私は手がかりではありません)、外部のXAMLスタイルで読み込むことを意味するメソッドにも開いています。ComboBoxから派生したWPF CustomControlのComboBoxアイテムにItemTemplateスタイルを適用します。

以下のコードは、使用しているコントロールの基本的な近似ですが、大幅に簡略化されています。しかし、ロードされるデータがどのように同じで、データオブジェクト自体が外部ソースから来ているのかに関する基本的な考え方は、とにかくコントロール自体にアクセスできないためです。テンプレートは にする必要があります。

 var data = new FormatData[]{ 
      new FormatData(){ 
       Name = "Normal" 
      }, 
      new FormatData(){ 
       Name = "Bold", 
       Bold = true 
      }, 
      new FormatData(){ 
       Name = "Italic", 
       Italic = true 
      }, 
      new FormatData(){ 
       Name = "BoldItalic", 
       Bold = true, 
       Italic = true 
      }, 
     }; 

     fddTest.LoadSelection(data); 

誰もが、私はこれを達成する方法のアイデアを持って次のように

public class FormatData 
{ 
    public FormatData() { } 
    public string Name { get; set; } 
    public bool Bold { get; set; } 
    public bool Italic { get; set; } 
} 

public class FormatDropDown : System.Windows.Controls.ComboBox 
{ 
    public FormatDropDown() 
    { 
    } 

    public void LoadSelection(FormatData[] data) 
    { 
     try 
     { 
      this.ItemsSource = data; 
      this.DisplayMemberPath = "Name"; 
     } 
     catch (Exception e) { MessageBox.Show(e.Message); ; } 
    } 
} 

制御が移入されますか?

答えて

2

これはどう:

public class FormatDropDown : System.Windows.Controls.ComboBox { 
    static FormatDropDown() { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(FormatDropDown), new FrameworkPropertyMetadata(typeof(FormatDropDown))); 
    } 

    public void LoadSelection(FormatData[] data) { 
     try { 
      this.ItemsSource = data; 
      this.DisplayMemberPath = "Name"; 
     } catch (Exception e) { MessageBox.Show(e.Message); ; } 
    } 
} 

、テーマファイル(generic.xaml)中:

<Style TargetType="{x:Type local:FormatDropDown}" BasedOn="{StaticResource {x:Type ComboBox}}"> 
    <Setter Property="ItemContainerStyle"> 
     <Setter.Value> 
      <Style TargetType="ComboBoxItem"> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding Bold}" Value="True"> 
         <Setter Property="FontWeight" Value="Bold" /> 
        </DataTrigger> 
        <DataTrigger Binding="{Binding Italic}" Value="True"> 
         <Setter Property="FontStyle" Value="Italic" /> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </Setter.Value> 
    </Setter> 
</Style> 

だから、基本的にカスタムコントロールのためのDefaultStyleKeyをオーバーライドします。