進捗状況が変更されたときにダウンロードリストを更新する必要があります。バインドされたリストの既存のアイテムが更新されたときに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。 ICollectionView
にList<>
を変更すると、リストが更新された後Application.Current.Dispatcher.Invoke(new Action(() => UiList.Refresh()));
を使用ViewModelにでApplication.Current.Dispatcher.Invoke(new Action(() => MyListView.Items.Refresh()));
:XAML分離コードの呼び出しで
:私はこれを修正する方法2つの方法を知っています。
どちらの方法が問題を引き起こす:
<Popup Name="Menu" StaysOpen="False">
:各を "リフレッシュ" した後、ユーザーの需要にオープンする必要があり、リストビュー点滅とポップアップは常にが閉じ私はポップアップを別のコントロールやパネルに置き換えることができますが、メインウィンドウの境界線から外れる可能性が必要です(画面上のように)。しかし、WPFにListViewの内容を更新する別の方法があると思います(点滅なし)。
PS:長い質問には申し訳ありませんが、私は...もっと簡潔
リストをObservableCollectionに変更する必要があります。 – Silvermind