2009-06-02 23 views
0

私は、検索フレーズが変更されたときにTreeViewを更新するリアルタイム更新バーを実装しようとしていますが、私が望むように更新することはできません。WPF searchboxとツリービューへのデータバインディング

すべての項目は、アプリケーションの起動時にツリービューに表示されます(現時点では1レベルの子のみが含まれています)。 SearchPhraseプロパティは、テキストボックスに入力するとPropertyChangedイベントが呼び出されたときにも正しく更新されますが、Items getは呼び出されません。私の推測では、それはプレゼンテーションモデルのItemsプロパティと関係があるということです。私は正しい?ここで

は私のXAMLです:

<Border BorderBrush="Black"> 
     <TextBox VerticalAlignment="Top" x:Name="phrase" Text="{ Binding  Path=SearchPhrase, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged }" Height="24" /> 
    </Border> 
    <TreeView Height="200" Background="Gainsboro" Name="list" ItemsSource="{ Binding Path=Items, Mode=OneWay, UpdateSourceTrigger=PropertyChanged }" ItemTemplate="{StaticResource dataTemplate}" /> 

そしてここでは、私のプレゼンテーションモデルです:

public class ProjectListPM : BasePM 
{ 
    private List<AnalysisInfo> items; 
    private String searchPhrase; 

    /// <summary> 
    /// Gets or sets the search phrase. 
    /// </summary> 
    public String SearchPhrase { 
     get 
     { 
      return this.searchPhrase; 
     } 
     set 
     { 
      if (value != null) 
      { 
       this.searchPhrase = value; 
       FirePropertyChanged<ProjectListPM>(o => o.SearchPhrase); 
      } 
     } 
    } 

    /// <summary> 
    /// The list of analysises to display in the list. 
    /// </summary> 
    public List<AnalysisInfo> Items { 
     get 
     { 
      return 
       items.OrderByDescending(i => i.GetSearchRelevanceTo(SearchPhrase)).Where(
        i => i.GetSearchRelevanceTo(SearchPhrase) > 0).ToList(); 
     } 
     set 
     { 
      if (value != null) 
      { 
       this.items = value; 
       FirePropertyChanged<ProjectListPM>(o => o.Items); 
      } 
     } 
    } 

    public ProjectListPM() 
    { 
     this.items = new List<AnalysisInfo>(); 
     this.SearchPhrase = String.Empty; 
    } 
} 

public class BasePM : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    /// <summary> 
    /// Called when a property is changed.  
    /// </summary> 
    /// <typeparam name="T">Type</typeparam> 
    /// <param name="exp">Function</param> 
    protected void FirePropertyChanged<T>(Expression<Func<T, Object>> exp) 
    { 
     string propertyName; 
     if (exp.Body is UnaryExpression) 
      propertyName = ((MemberExpression)((UnaryExpression)exp.Body).Operand).Member.Name; 
     else 
      propertyName = ((MemberExpression)exp.Body).Member.Name; 
     if (PropertyChanged != null) 
     { 
      //Switch to UI thread 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

答えて

1

検索フレーズに基づいてツリービューのアイテムコレクションをフィルタしたいようです。あなたはSearchPhraseセッターに行を追加することができますすぐに解決策として

set 
{ 
    if (value != null) 
    { 
     this.searchPhrase = value; 
     FirePropertyChanged<ProjectListPM>(o => o.SearchPhrase); 
     FirePropertyChanged<ProjectListPM>(0 => o.Items); 
    } 
} 

これはいつでもあなたがSearchPhraseを設定する項目を更新するUIを通知します。

異なるアプローチをしたい場合は、ItemsControlからBasePMを拡張し、コンストラクターでItemsSourceおよびItems.Filterプロパティーを設定し、SearchPhraseを設定するときにItems.Refresh()を呼び出すことができます。

+0

これはまさに私が自分自身を見つけた解決策でした。ありがとう、:) – atsjoo

0

は、WPFを使用することができ、あなたのListクラスの1ですか?私はSystem.Collections.ObjectModel.ObservableCollectionを使用することをお勧めします。これは既にWPFと互換性のあるリスト変更イベントを実装しているためです。

関連する問題