2012-02-27 26 views
3

TreeViewItemにアタッチする単純な依存プロパティを作成しましたが、これはボタンなどの他のコントロールでも同様ですが、TreeViewItemの使い方を理解できません私の定義されたスタイルを失うことなくツリービューで。以下のコードでは、 "'ErrorTreeViewItem'型用のスタイルは 'TreeViewItem'型には適用できません。"WPFのTreeViewItemをサブクラス化してtreevviewで使用する方法

public class ErrorTreeViewItem : TreeViewItem 
{ 
    static ErrorTreeViewItem() 
    { 
    } 

    public bool ErrorState 
    { 
     get { return (bool)GetValue(ErrorStateProperty); } 
     set { base.SetValue(ErrorStateProperty, value); } 
    } 

    public static readonly DependencyProperty ErrorStateProperty = 
     DependencyProperty.Register("ErrorState", typeof(bool), typeof(ErrorTreeViewItem), new UIPropertyMetadata(false)); 
} 

私のツリービューのスタイルは次のようになります。

 <Style TargetType="me:ErrorTreeViewItem"> 

     <Style.Resources> 
      ... 
     </Style.Resources> 
      <Setter Property="HorizontalContentAlignment" Value="Stretch"/> 
      <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="TreeViewItem"> 
       ... 
      </Setter.Value> 
     </Setter> 

私はそれが好きで使用しています:

<TreeView Name="ApplicationTree" ItemsSource="{Binding Applications}" HorizontalContentAlignment="Stretch" Background="#E8E8E8" > 
     <TreeView.ItemContainerStyle> 
      <Style TargetType="me:ErrorTreeViewItem" BasedOn="{StaticResource {x:Type TreeViewItem}}"> 
       <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" /> 
       <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" /> 
       <Setter Property="HorizontalContentAlignment" Value="Stretch"/> 
      </Style> 
     </TreeView.ItemContainerStyle> 
+0

あなたがそれらを理解していない(組み込みが難しい)ために、またはそれらが存在していることを知らなかったため、組み込みの検証サービスを使用していませんか? IDataErrorInfo。 – Will

+0

いいえ、自分の依存関係プロパティの値に基づいてツリービュー項目の色を変更したいだけではありません。これは難しいとは思わなかった! – user1145533

+1

これを行うにはいくつかの方法があります。モデルのIDataErrorInfo(MVVMを使用している場合)は自動的に検証をトリガし、標準のWPFコントロールで無効なテンプレートを表示します。また、TreeViewItemに添付されたDependencyPropertyを使ってみることもできるので、基本クラスなどを拡張する必要はありません*私はWPFでこれをやったことはありませんが、WinFormsでこれを達成することは分かっていますTreeViewクラスを拡張することもできます。新しいTVIを作成するときは、代わりにそのタイプのインスタンスを返します。それはあなたのエラーが上がっているところです。 – Will

答えて

0

TreeViewはそうあなたが最初にそれを作るようにする必要があり、デフォルトTreeViewItemsを作成します。 ツリービューアイテム。そのためにはTreeViewをサブクラス化し、PrepareContainerForItemをオーバーライドしてErrorTreeViewItemの新しいインスタンスを返す必要があります。

関連する問題