win10 uwp 通知列表
經(jīng)常看到小伙伴問,問已經(jīng)綁定列表,在進(jìn)行修改時(shí),不會(huì)通知界面添加或刪除。這時(shí)問題就在,一般使用的列表不會(huì)在添加時(shí)通知界面,因?yàn)樗麄儧]有通知。
本文:知道什么是通知的列表,如何去寫一個(gè)通知列表
<!--more-->在 C# 很少直接使用數(shù)組,因?yàn)閿?shù)組難以指定類型,需要指定類型的,一般都會(huì)使用 List<T> 。而 List 我就叫他列表,繼承 ICollection 的類,一般就可以叫列表。
但是在使用 ListView 直接給 List 作為 Source ,那么只會(huì)在初次顯示,之后無論對(duì) List 進(jìn)行什么修改,都不會(huì)導(dǎo)致界面的列表項(xiàng)修改。
當(dāng)然如果列表使用的類的屬性有通知,對(duì)他進(jìn)行修改,還是可以看到界面修改。
如果希望對(duì)列表修改時(shí),界面也變化,那么簡(jiǎn)單方法是使用 ObservableCollection。
不需要對(duì) ObservableCollection 的屬性進(jìn)行通知,也就是 下面代碼實(shí)際是不需要的
public ObservableCollection<string> ObservableCollection{set{_observableCollection = value;OnPropertyChanged();}get{return _observableCollection;}}private ObservableCollection<string> _observableCollection;如果需要修改項(xiàng),只需要進(jìn)行和List一樣的添加或移除元素就可以。
如果想問,為何使用 ObservableCollection 就可以通知界面修改了元素,而使用 List 就不可以。
其實(shí)因?yàn)?ObservableCollection 繼承了 INotifyCollectionChanged ,他可以通知 ListView 說修改了項(xiàng)。
如果對(duì)于上面的說法覺得還是不行,那么深一點(diǎn),來解釋一下 ListView 是如何知道 ObservableCollection 修改了。
首先在給 Source 值的時(shí)候,會(huì)自動(dòng)判斷是不是有 INotifyCollectionChanged ,如果是的話,自動(dòng)監(jiān)聽。
因?yàn)?ListView 的 Source 大概就是這樣,下面代碼和真的 Source 是不一樣,但是大概也是這樣的
/// <summary>/// 標(biāo)識(shí) <see cref="Source"/> 的依賴項(xiàng)屬性。/// </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>/// 獲取或設(shè)置/// </summary>public object Source{get { return (object) GetValue(SourceProperty); }set { SetValue(SourceProperty, value); }}判斷傳入的是不 INotifyCollectionChanged ,如果是的話,獲取他修改時(shí),是什么,添加或刪除,修改的元素是哪個(gè)。
于是這樣就可以綁定時(shí),進(jìn)行修改 列表就可以讓界面得到。
那么 ObservableCollection 缺少了很多東西,如添加多個(gè)元素,需要每次都進(jìn)行 遍歷,是不是可以自己寫一個(gè)和 ObservableCollection 差不多的?
于是我就來寫一個(gè),很簡(jiǎn)單的代碼
首先需要給他一個(gè)名字,這里是隨意給的。
但是命名是需要時(shí)間,經(jīng)過很久,我想到詭異的名字。
需要做一個(gè)泛型,然后繼承 Collection 和通知。繼承 Collection 可以少寫代碼,因?yàn)榛镜奶砑铀隽恕?/p> public class AvaloniaCol<T> : Collection<T>, INotifyCollectionChanged
那么繼承了 Collection 不可以直接寫添加函數(shù),如何做?實(shí)際他可以直接 InsertItem 就是添加會(huì)調(diào)用。
protected override void InsertItem(int index, T item){base.InsertItem(index, item);CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item, index));}需要做的就是使用 原來的方法,但是加一個(gè)通知,通知時(shí)需要告訴當(dāng)前是添加和添加的元素
寫了添加自然需要寫刪除
protected override void RemoveItem(int index){var temp = this[index];base.RemoveItem(index);CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, temp, index));}代碼就這么簡(jiǎn)單,在界面寫個(gè)按鈕,用于添加或移除
可以看到界面就是進(jìn)行變換,就這么簡(jiǎn)單寫通知列表。
代碼:http://download.csdn.net/detail/lindexi_gd/9826807
本作品采用知識(shí)共享署名-非商業(yè)性使用-相同方式共享 4.0 國(guó)際許可協(xié)議進(jìn)行許可。歡迎轉(zhuǎn)載、使用、重新發(fā)布,但務(wù)必保留文章署名林德熙(包含鏈接:http://blog.csdn.net/lindexi_gd ),不得用于商業(yè)目的,基于本文修改后的作品務(wù)必以相同的許可發(fā)布。如有任何疑問,請(qǐng)與我聯(lián)系。
轉(zhuǎn)載于:https://www.cnblogs.com/lindexi/p/6949657.html
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的win10 uwp 通知列表的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 道琼斯几点开市
- 下一篇: dede调用当前顶级栏目名称、ID、ur