2009-04-01 17 views
3

これはかなり複雑です。うまくいけば、誰かが私を助けてくれるほど十分に明確にすることができます。私はオブジェクトをマネージャーと呼ぶことができます、マネージャーは彼が管理する人々のコレクションを持っています、人々はすべてIPersonを実装しますが、人々のタイプは異なっています。私はこのマネージャーをツリーに表示したいと思っています。マネージャーノードの下では、管理しているすべてのプロジェクトを表示したいと思います。管理しているプロジェクトから決定することができます。ItemsSource + Converter + Treeview wont update

したがって、コンバータを使用して人をプロジェクトのリストに変換することを計画しています。ここでXAMLは次のとおりです。

<HierarchicalDataTemplate DataType="{x:Type ui:Manager}"> 
    <TextBlock Text="{Binding Path=Name}"/> 
    <HierarchicalDataTemplate.ItemTemplate> 
     <DataTemplate> 
        <TextBlock Text="{Binding}"/> 
     </DataTemplate> 
    </HierarchicalDataTemplate.ItemTemplate> 
    <HierarchicalDataTemplate.ItemsSource> 
     <Binding Path="People"> 
      <Binding.Converter> 
       <configUtil:ProjectListConverter/> 
      </Binding.Converter> 
     </Binding> 
    </HierarchicalDataTemplate.ItemsSource> 
</HierarchicalDataTemplate> 

私のPersonクラスはINotifyPropertyChangedのを実装し、人々を保持しているリストはINotifyCollectionChanged.Thisコードは、私がツリービューのItemsSourceを設定すると、管理者は、プロジェクトの自分のリストに表示されている素晴らしい作品実装します。

ただし、人のリストに新しい人物を追加すると、ツリービューは更新されません。デバッグすると、Addアクションと追加されたアイテムでCollectionChangedが起動していることがわかります。また、CollectionChangedイベントはnullではないので、私はUIがそれを見ていることを知っています。ただし、アイテムが追加されたときにConverterは実行されません。ここ

はIPersonオブジェクトを保持するリストのAddメソッドである:

public void Add(T item) 
{ 
    list.Add(item); 
    OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item)); 
} 

私は何とかデータバインディングを壊すだろうか?

他に何が確認できますか?

ConverterはPeopleリストの各項目を調べ、自分がどのプロジェクトを担当しているかを把握し、プロジェクト名を出力リストに追加します。

答えて

2

コンバータは、コレクションを格納するプロパティに適用されます。したがって、コレクションインスタンス自体が変更された場合(コレクション内の項目が変更されていない場合)にのみ呼び出されます。これを回避する方法の1つは、コレクションを更新するときにコレクションを無効にすることです。

コレクションプロパティを無効にしてコンバータコードを再度実行させる最も簡単な方法は、コレクションをnullにして再割り当てすることです。別の方法は、BindingExpressionBindingOperations経由)を取得し、UpdateTargetに電話することです。最後に、CollectionView(またはそのサブクラス)にバインドして、Refreshを呼び出すこともできます。

本当にの場合は、自分の実装であるICollectionViewにバインドして、フィルタリングし、必要に応じてイベントを発生させることができます。

+0

あなたの言うことを理解していると思いますが、hierarcicalDataTemplateを使用してそれを行う方法がわかりません。私が正しく理解していれば、PeopleViewをCollectionViewにラップし、コレクションが変更されたときにCollectionViewを更新したいと思っています。いくつかのコード例は大きな助けになるでしょう。 – Kelly

+0

助けてくれてありがとう、私は人々コレクションの変更イベントを購読し、それ自身を更新したプロジェクトのObservableCollectionに自分の人リストをラップすることによってそれを働かせました。 – Kelly