经常看到小伙伴问,问已经绑定列表,在进行修改时,不会通知界面添加或删除。这时问题就在,一般使用的列表不会在添加时通知界面,因为他们没有通知。
本文:知道什么是通知的列表,如何去写一个通知列表
<!--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 是不一样,但是大概也是这样的
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();
}
};
}
}));
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 ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。
<script type="text/javascript">
$(function () {
$('pre.prettyprint code').each(function () {
var lines = $(this).text().split('\n').length;
var $numbering = $('<ul/>').addClass('pre-numbering').hide();
$(this).addClass('has-numbering').parent().append($numbering);
for (i = 1; i <= lines; i++) {
$numbering.append($('<li/>').text(i));
};
$numbering.fadeIn(1700);
});
});
</script>
分享到:
相关推荐
总结来说,"win10 uwp 轻量级 MVVM 框架入门 2.1.5.3199 例子"提供了一个实际操作的平台,让开发者学习如何在UWP环境中利用MVVM模式进行开发。通过分析和实践这个框架,你将能够更好地理解MVVM的工作原理,以及如何...
易语言win10弹窗通知模块是专门为在Windows 10操作系统上创建和显示桌面通知而设计的一个功能组件。这个模块通过易语言的接口与Windows 10的API进行交互,从而实现用户界面中的通知功能。 在Windows 10操作系统中,...
微软推出的开源UWP社区工具包(Windows Community Toolkit)是一个关键的资源,它旨在简化和加速开发流程,使得开发者能够更高效地利用Win10 SDK进行编程。 UWP社区工具包是一个集合了各种辅助工具、组件和示例代码...
在MVVM中,换肤可以通过ViewModel来控制,ViewModel负责接收用户的选择并通知View进行更新。 8. **VisualStateManager与ControlTemplate**:VisualStateManager用于管理控件在不同状态下的外观,ControlTemplate则...
然后为每个目标平台(包括UWP)创建一个平台特定的项目,用于处理特定于平台的功能,如本地通知、文件系统访问等。 4. **XAML界面设计** 使用XAML,开发者可以轻松地定义控件布局、样式和数据绑定。在UWP项目中,...
4. 开发跨平台的UWP应用,充分利用Windows 10的特性如Live Tiles、通知中心等。 总的来说,Windows 10 SDK 10.0.19041.1是一个强大的开发工具集合,它不仅为开发者提供了构建高质量Windows应用所需的一切,还通过...
“UWP-Demo”作为一个桌面应用程序,可能使用了桌面应用桥(Desktop App Converter)工具,该工具允许传统Win32应用转换为UWP包装,从而获得UWP的一些优势,如Windows Store分发、现代权限管理等。 **7. 调试和测试...
- WinUI 是一套现代化的 UI 控件和 XAML 控件库,专为 Windows 10 设计,可用于 UWP 和 Win32 应用程序。 2. **MSIX:** - MSIX 是一种新的应用程序打包格式,支持传统 Win32 应用程序和 UWP 应用程序的安装和...
在这个场景中,"DirectShow打开摄像头(Win10+SV2102)"指的是使用DirectShow库在Windows 10系统环境下,结合特定版本(SV2102)的SDK或者更新,来访问和操作摄像头设备。 在Windows 10中,DirectShow仍然是一个...
描述中提到的“gank.io首个win10客户端,支持磁贴、通知、小娜……已发布到应用商店,欢迎下载。”意味着这款应用不仅具有常规的客户端功能,还充分利用了UWP平台的特点。它支持Windows 10的动态磁贴,可以实时展示...
该项目已经进行了升级,采用了Win UI 2.8库,这是一项重要的更新,因为Win UI使得开发者能够创建更加现代化、高性能且具有统一用户界面的UWP应用。Win UI 2.8包含了最新的UI控件和设计元素,提升了应用的视觉效果和...
- **Modern UI 的演变**:Windows 10 中的 Modern UI(现称为 UWP 应用)在设计上进行了调整,旨在提供更加统一且流畅的用户体验。 - **适应性设计**:Modern UI 的应用能够更好地适应不同屏幕尺寸和设备类型,无论...
- WPF(Windows Presentation Foundation)和UWP(Universal Windows Platform):这两种是现代Windows应用开发框架,提供了更高级的图形渲染和用户体验,但它们也有自己的方式来设置背景图,与Win32 API有所不同。...
这个轻量级的库使得开发者能够轻松地在Windows 8和Windows 10系统上集成通知功能,以便向用户传达重要的信息和实时事件。这些通知通常会出现在屏幕的右下角,允许用户快速查看和对这些信息做出响应,而无需离开当前...
通用Windows平台(Universal Windows Platform, UWP)是微软为开发者提供的一个统一的框架,允许应用程序在各种Windows 10设备上运行,包括PC、手机、Xbox、HoloLens等。 首先,让我们关注Win API的核心组成部分:...
Win32 API是Windows平台开发的基础,虽然现代的.NET Framework、Windows Runtime(WinRT)和Universal Windows Platform(UWP)提供了新的开发方式,但Win32 API仍然在很多场合被广泛使用,特别是在需要底层系统控制...
以下内容将详细介绍Windows 10的通用Windows平台(UWP)的开发,包括但不限于XAML基础、布局设计、用户交互、样式、资源和主题、图形、变换和动画、数据绑定、导航和窗口管理以及动态磁贴和通知等方面的开发技术。...
6. **Live Tiles和通知**:Windows 10的应用可以使用Live Tiles实时更新内容,提供动态的通知。通过XAML和C#,开发者可以实现这些功能,提高应用的互动性和吸引力。 7. **Xamarin集成**:虽然标签中只提到了C#,但...
此外,还可以使用UWP组件来扩展桌面应用的功能,例如添加Windows 10特有的用户活动和通知。 Fluent Design System是微软推荐的设计语言,用于创建符合现代审美、具有良好交互性的应用界面。它包含了诸如深度、运动...
6. **配置文件与项目结构:** 提供的文件列表中,`App.config`用于配置应用程序,`BLECode.cs`包含了BLE相关的代码,`Form1.Designer.cs`和`Form1.cs`定义了WinForm界面和逻辑,`Program.cs`是程序入口,`...