2011-12-18 17 views
0

HierarchicalDataTemplateでTreeViewを使用していますが、IsExpandedプロパティを最初のレベルより高いレベルで動作させることはできません。ここに私のXAMLです:私は私のResourceDictionaryでIsExpandedはTreeViewの第1レベルでのみ機能します

<TreeView> 
    <TreeView.ItemTemplate> 
     <HierarchicalDataTemplate ItemsSource="{Binding Children}"> 
      <TextBlock Text="{Binding Text}" /> 
     </HierarchicalDataTemplate> 
    </TreeView.ItemTemplate> 
</TreeView> 

<Style TargetType="TreeViewItem"> 
    <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" /> 
</Style> 

一次作品を作るもの。

高いインデントレベルでは、PropertyChangedEventHandlerが子に対して起動されないため、IsExpandedは常にfalseです。

public class ListItem : INotifyPropertyChanged 
{ 
    private bool isExpanded; 
    public bool IsExpanded 
    { 
     get { return isExpanded; } 
     set 
     { 
      if (isExpanded != value) 
      { 
       isExpanded = value; 
       SendPropertyChanged("IsExpanded"); 
      } 
     } 
    } 
    private void SendPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    public ObservableCollection<ListItem> Children { get; set; } 
    ... 
} 

EDIT:

はここに私のクラスだ、私は非常に申し訳ありませんが、私の修正コードが動作していますよ!

+0

あなたは、実行時に値をchaningています?もしあなたが['INPC'](http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx)を実装すべきならば、それは' public'でなければなりません。 *(ちなみに、複数の「子」は「子」です)* –

+0

私はWPFが新しく、その仕組みが不明です。 INotifyPropertyChangedクラスからアイテムを継承する必要がありますが、最初のレベルより高いレベルで呼び出されたPropertyChangedハンドラを取得する方法はありますか? – zee

+0

これはクラスではなく、インターフェイスです。一般的な[データバインディングの概要](http://msdn.microsoft.com/en-us/library/ms752347.aspx)と[article INPCの実装の詳細については、http://msdn.microsoft.com/en-us/library/ms229614.aspx(英語)を参照してください。これはツリーレベルとは関係ありません。 –

答えて

0

あなたも自動的にターゲットアイテムをすべての子を展開したい場合、あなたはこのような何かを、下向きに自分で変更をpropogateする必要があります....

public bool IsExpanded 
{ 
    get { return isExpanded; } 

    set 
    { 
     if (isExpanded != value) 
     { 
      isExpanded = value; 
      if (isExpanded) 
      { 
       foreach(ListItem child in Children) 
        child.IsExpanded = true; 
      } 
      SendPropertyChanged("IsExpanded"); 
     } 
    } 
} 
+0

私は全体を保存したい木の状態 – zee

関連する問題