win10 uwp 通知列表
經常看到小伙伴問,問已經綁定列表,在進行修改時,不會通知界面添加或刪除。這時問題就在,一般使用的列表不會在添加時通知界面,因為他們沒有通知。
本文:知道什么是通知的列表,如何去寫一個通知列表
<!--more-->在 C# 很少直接使用數組,因為數組難以指定類型,需要指定類型的,一般都會使用 List<T> 。而 List 我就叫他列表,繼承 ICollection 的類,一般就可以叫列表。
但是在使用 ListView 直接給 List 作為 Source ,那么只會在初次顯示,之后無論對 List 進行什么修改,都不會導致界面的列表項修改。
當然如果列表使用的類的屬性有通知,對他進行修改,還是可以看到界面修改。
如果希望對列表修改時,界面也變化,那么簡單方法是使用 ObservableCollection。
不需要對 ObservableCollection 的屬性進行通知,也就是 下面代碼實際是不需要的
public ObservableCollection<string> ObservableCollection{set{_observableCollection = value;OnPropertyChanged();}get{return _observableCollection;}}private ObservableCollection<string> _observableCollection;如果需要修改項,只需要進行和List一樣的添加或移除元素就可以。
如果想問,為何使用 ObservableCollection 就可以通知界面修改了元素,而使用 List 就不可以。
其實因為 ObservableCollection 繼承了 INotifyCollectionChanged ,他可以通知 ListView 說修改了項。
如果對于上面的說法覺得還是不行,那么深一點,來解釋一下 ListView 是如何知道 ObservableCollection 修改了。
首先在給 Source 值的時候,會自動判斷是不是有 INotifyCollectionChanged ,如果是的話,自動監聽。
因為 ListView 的 Source 大概就是這樣,下面代碼和真的 Source 是不一樣,但是大概也是這樣的
/// <summary>/// 標識 <see cref="Source"/> 的依賴項屬性。/// </summary>public static readonly DependencyProperty SourceProperty = DependencyProperty.Register("Source", typeof(object), typeof(MainPage), new PropertyMetadata(default(object), (s, e) =>{var c = s as INotifyCollectionChanged;if (c != null){c.CollectionChanged += (sender, args) =>{switch (args.Action){case NotifyCollectionChangedAction.Add:break;case NotifyCollectionChangedAction.Move:break;case NotifyCollectionChangedAction.Remove:break;case NotifyCollectionChangedAction.Replace:break;case NotifyCollectionChangedAction.Reset:break;default:throw new ArgumentOutOfRangeException();}};}}));/// <summary>/// 獲取或設置/// </summary>public object Source{get { return (object) GetValue(SourceProperty); }set { SetValue(SourceProperty, value); }}判斷傳入的是不 INotifyCollectionChanged ,如果是的話,獲取他修改時,是什么,添加或刪除,修改的元素是哪個。
于是這樣就可以綁定時,進行修改 列表就可以讓界面得到。
那么 ObservableCollection 缺少了很多東西,如添加多個元素,需要每次都進行 遍歷,是不是可以自己寫一個和 ObservableCollection 差不多的?
于是我就來寫一個,很簡單的代碼
首先需要給他一個名字,這里是隨意給的。
但是命名是需要時間,經過很久,我想到詭異的名字。
需要做一個泛型,然后繼承 Collection 和通知。繼承 Collection 可以少寫代碼,因為基本的添加他做了。
public class AvaloniaCol<T> : Collection<T>, INotifyCollectionChanged那么繼承了 Collection 不可以直接寫添加函數,如何做?實際他可以直接 InsertItem 就是添加會調用。
protected override void InsertItem(int index, T item){base.InsertItem(index, item);CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item, index));}需要做的就是使用 原來的方法,但是加一個通知,通知時需要告訴當前是添加和添加的元素
寫了添加自然需要寫刪除
protected override void RemoveItem(int index){var temp = this[index];base.RemoveItem(index);CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, temp, index));}代碼就這么簡單,在界面寫個按鈕,用于添加或移除
可以看到界面就是進行變換,就這么簡單寫通知列表。
代碼:http://download.csdn.net/detail/lindexi_gd/9826807
本作品采用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。歡迎轉載、使用、重新發布,但務必保留文章署名林德熙(包含鏈接:http://blog.csdn.net/lindexi_gd ),不得用于商業目的,基于本文修改后的作品務必以相同的許可發布。如有任何疑問,請與我聯系。
轉載于:https://www.cnblogs.com/lindexi/p/6949657.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的win10 uwp 通知列表的全部內容,希望文章能夠幫你解決所遇到的問題。