2009-05-26 7 views
0

を再描画ません。コレクションが変更されると、アイテムはリストに正常に追加されますが、リストボックスのサイズを変更してリストボックスを強制的に再描画するまで、表示は更新されません。WPFリストボックスIのようにXAMLで定義されたリストボックスを持っている

なぜでしょうか?

EDIT:INotifyPropertyChangedの実装

public class FileScannerPresenter : INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged; 
     private FileScanner _FileScanner; 

     public FileScannerPresenter() 
     { 
      this._FileScanner = new FileScanner(); 
     } 

     public List<DirectoryInfo> SelectedDirectories 
     { 
      get 
      { 
       return _FileScanner.Directories; 
      } 
     } 

     public void AddDirectory(string path) 
     { 
      this._FileScanner.AddDirectory(path); 
      OnPropertyChanged("SelectedDirectories"); 
     } 

     public void OnPropertyChanged(string property) 
     { 
      if (this.PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(property)); 
      } 
     } 
    } 

答えて

3

代わり

ObservableCollection<DirectoryInfo> 

を試してみてください - あなたは理由もなく全体のListBoxのリフレッシュをトリガしている、とあなたはあなたのホスティングクラスを作成する必要はありません。 INotifyPropertyChangedを実装すると、簡単にウィンドウのプロパティにすることができます。キーは、プロパティを新しいインスタンスに決して設定しないことです。だから、:あなたはFileScannerクラスは、あなたの代わりにINotifyCollectionChangedを実装する必要があることを使用して終了

class SomeWindow : Window { 
    public ObservableCollection<DirectoryInfo> SelectedDirectories {get; private set;} 

    SomeWindow() { SelectedDirectories = new ObservableCollection<DirectoryInfo>(); } 

    public void AddDirectory(string path) { 
     SelectedDirectories.Add(new DirectoryInfo(path)); 
    } 
} 

場合 - そのように、リストボックスを動的に追加/削除することを知っています。

+0

あなたは右w.r.t.ですなぜ私の前のコードスニペットが働いたのですか?更新しました。 +1 – Gishu

+0

私はObservableCollection内のプレゼンタークラスにコレクションを抽象化し、必要に応じてそのクラスをスキャナークラスに渡すだけでした。 – benPearce

0

(下記のアップデートを参照)。 WPFは正常に動作しているようです。あなたのコードを新しいプロジェクトに入れます。 AddDirectoryを呼び出すためにボタンをクリックするたびにリストボックスが更新されます。これ以上コードを変更する必要はありません。 問題は他のものと思われます。UIに複数のスレッドがありますか?

私はFileScannerタイプを持っていませんでした。だから私は以下のようにダミーを作成しました。

public class FileScanner 
    { 
     string _path; 
     public FileScanner() 
     {  _path = @"c:\";  } 
     public List<DirectoryInfo> Directories 
     { 
     get 
     { 
      return Directory.GetDirectories(_path).Select(path => new DirectoryInfo(path)).ToList(); 
     } 
     } 

     internal void AddDirectory(string path) 
     {   _path = path;  } 
    } 

FileScannerPresenterクラスに変更はありません。またはリストボックスXAML。あなたのリストボックス、テキストボックス、およびボタンを含むDockPanelでウィンドウを作成しました。

更新:ポールベッツが正しいです。これは、Boundプロパティから毎回新しいリストを返すので機能します。リストとのデータバインディングは、常に私を混乱させます。もっと工夫して 、これを行う簡単な方法は、次のとおりです。

  • FileScannerの#ディレクトリを作成します(あなたのためのINotifyCollectionChangedを実装する)ObservableCollection<DirectoryInfo>を返します。すべてのシグネチャを一番上に置き換えて、List<DirectoryInfo>
  • のいずれかを返します。FileScannerとFileScannerPresenter自体は、INotifyXXXインターフェイスを実装する必要はありません。

    // in FileScanner class def   
        public ObservableCollection<DirectoryInfo> Directories 
        { 
        get 
        { return _DirList; } 
        } 
        internal void AddDirectory(string path) 
        { 
        _path = path; 
        //var newItems = Directory.GetDirectories(_path).Select(thePath => new DirectoryInfo(thePath)).ToList(); 
        //_DirList.Concat(newItems); -- doesn't work for some reason. 
        foreach (var info in Directory.GetDirectories(_path).Select(thePath => new DirectoryInfo(thePath)).ToList()) 
        { 
         _DirList.Add(info); 
        } 
        } 
    
+1

List <>のGetterが毎回新しいリストを返すので、コードが機能します - 同じリスト(FileScannerの.ctorでインスタンス化されたリスト)を返した場合、afaikは機能しません –

関連する問題