Listbox綁定數據通過ItemsSource來的,如果綁定的是普通的List<數據>,不會自己刷新。
使用ObservableCollection集合
解決問題的方法:
- 將數組替換為 ObservableCollection
ObservableCollection 是專為綁定設計的集合類型,可以通知 WPF 綁定的集合數據發生變化。
如果本身是List,可以修改為:
using System.Collections.ObjectModel;public ObservableCollection<MyItem> MyItems { get; set; }public MainViewModel()
{MyItems = new ObservableCollection<MyItem>{new MyItem { showsafeui = true, SomeOtherProperty = "Item 1" },new MyItem { showsafeui = false, SomeOtherProperty = "Item 2" },new MyItem { showsafeui = true, SomeOtherProperty = "Item 3" }};
}// 動態添加或刪除數據
public void AddNewItem()
{MyItems.Add(new MyItem { showsafeui = true, SomeOtherProperty = "New Item" });
}public void RemoveItem()
{if (MyItems.Any())MyItems.RemoveAt(0);
}
使用 ObservableCollection 后,新增、刪除、或重新排序數據時,ListBox 會自動刷新。
數據內容變化的刷新INotifyPropertyChanged
上面的數據,如果某個屬性的內容發生了變化如何刷新。可以使用INotifyPropertyChanged。
public class HeartInfo : INotifyPropertyChanged
{public int id { get; set; }public bool showsafeui{ get; set; }public event PropertyChangedEventHandler PropertyChanged;protected void OnPropertyChanged([CallerMemberName] string propertyName = null){Console.WriteLine("刷新UI------------");PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));}
}
刷新單個數據
這樣在某個屬性變化的時候,可以
public bool showsafeui{get => _showsafeui;set{if (_showsafeui != value){_showsafeui = value;OnPropertyChanged(); // 通知綁定屬性更改}}}
刷新多個數據
如果某個屬性變化需要刷新多個
private bool _showsafe;public bool showsafe{get => _showsafe;set{if (_showsafe != value){_showsafe = value;OnPropertyChanged(); // 通知綁定的 showsafe 屬性OnPropertyChanged(nameof(showsafeui)); // 通知綁定的 showsafeui 屬性}}}
簡化刷新所有
我每次都想有一個屬性變化,刷新所有屬性
可以OnPropertyChanged(string.Empty)傳入空
private int _updateall = 0;public int updateall {get { return _updateuistat;}set {if (_updateall!= value) { _updateall= 0; OnPropertyChanged(string.Empty); }} //刷新ui
}
這樣我每次屬性變化都調用updateall = 1,就全部刷新了。