2012-03-30 15 views
0

進捗状況が変更されたときにダウンロードリストを更新する必要があります。バインドされたリストの既存のアイテムが更新されたときにListViewを更新する方法

XAML:ロジック・クラスのインスタンスを作成し、リストビューの内容を更新

<ListView ItemsSource="{Binding UiList}" x:Name="MyListView"> 
    <ListView.View> 
    <GridView> 
     <GridViewColumn Header="Title"/> 
     <GridViewColumn Header="Progress"/> 
    </GridView> 
    </ListView.View> 
</ListView> 

ビューモデル:

public class Logic 
{ 
    readonly List<Model> _list = new List<Model>(); 
    public event EventHandler Update; 

    public List<Model> List 
    { 
     get { return _list; } 
    } 

    public void Start() 
    { 
     for (int i = 0; i < 100; i++) 
     { 
      _list.Clear(); 
      _list.Add(new Model{Progress = i, Title = "title1"}); 
      _list.Add(new Model { Progress = i, Title = "title2" }); 

      var time = DateTime.Now.AddSeconds(2); 
      while (time > DateTime.Now) 
      { } 

      Update(this, EventArgs.Empty); 
     } 
    } 
} 

上記のコード更新ない:ロジック

class MainWindowViewModel : ViewModelBase 
{ 
    private readonly Logic _logic; 
    public List<Model> UiList { get; set; }   

    public MainWindowViewModel() 
    { 
     _logic = new Logic(); 
     _logic.Update += LogicUpdate; 
     Start = new RelayCommand(() => 
            { 
             var worker = new BackgroundWorker(); 
             worker.DoWork += (sender, args) => _logic.Start(); 
             worker.RunWorkerAsync(); 
            }); 
    } 

    void LogicUpdate(object sender, EventArgs e) 
    { 
     UiList = _logic.List; 
     RaisePropertyChanged("UiList");    
    } 

    public ICommand Start { get; set; } 
} 

UI。 ICollectionViewList<>を変更すると、リストが更新された後Application.Current.Dispatcher.Invoke(new Action(() => UiList.Refresh()));を使用ViewModelにでApplication.Current.Dispatcher.Invoke(new Action(() => MyListView.Items.Refresh()));

  • :XAML分離コードの呼び出しで

    1. :私はこれを修正する方法2つの方法を知っています。

    どちらの方法が問題を引き起こす:

    Popup

    <Popup Name="Menu" StaysOpen="False"> 
    
    :各を "リフレッシュ" した後、ユーザーの需要にオープンする必要があり、リストビュー点滅ポップアップは常にが閉じ

    私はポップアップを別のコントロールやパネルに置き換えることができますが、メインウィンドウの境界線から外れる可能性が必要です(画面上のように)。しかし、WPFにListViewの内容を更新する別の方法があると思います(点滅なし)。

    PS:長い質問には申し訳ありませんが、私は...もっと簡潔

  • +0

    リストをObservableCollectionに変更する必要があります。 – Silvermind

    答えて

    0

    私はここで答えを見つけた:How do I update an existing element of an ObservableCollection?

    のObservableCollectionは、部分的なソリューションです。 ObservableCollectionは、コレクションの変更(項目の追加、削除など)を行った場合にのみCollectionChangedイベントを発生させます。既存の項目の更新をサポートするには、コレクション内の各オブジェクト(私の場合はModelクラス)がINotifyPropertyChangedインターフェイスを実装する必要があります。

    // I used this parent (ViewModelBase) for quick testing because it implements INotifyPropertyChanged 
    public class Model : ViewModelBase 
    { 
        private int _progress; 
        public int Progress 
        { 
         get { return _progress; } 
         set 
         { 
          _progress = value; 
          RaisePropertyChanged("Progress"); 
         } 
        } 
    
        public string Title { get; set; } 
    } 
    
    1

    を、それを記述する方法がわからない私は、この行は動作しません理由を考える

    RaisePropertyChanged("UiList"); 
    

    です実際にリストを変更していないためです。あなたはそれをクリアしてそれを再投入しましたが、それはまだ同じリストへの参照です。あなたのリストを消去して再投入するのではなく、実際に新しいリストを作成した場合、どうなるのか興味があります。私はあなたの期待どおりリストビューを更新する必要がありますと思う。それがあなたのポップアップに影響を与えるかどうか、私は知らない。

    +0

    はい、新しいリストを作成すると、リストビューの更新を修正する新しい方法(ベストbtw、ありがとう!)が得られます。しかし、それはポップアップ問題を解決しません... –

    関連する問題