概述在C#中
消息有两个指向,一个指向Message,一个指向INotify。这里主要讲INotify。 INotify也有人称之为[通知],不管叫消息还是通知,都是一个意思,就是传递信息。 消息的定义 I
在C#中消息有两个指向,一个指向Message,一个指向INotify。这里主要讲INotify。
INotify也有人称之为[通知],不管叫消息还是通知,都是一个意思,就是传递信息。
INotify消息其实是一个接口,接口名叫INotifyPropertyChanged。接口定义如下:
定义很简单,我们可以看到这个接口只定义了一个事件属性——PropertyChanged。所以这个PropertyChanged就是消息的核心了。
那么学习应用消息的方法就出现了,即,创建一个继承INotifyPropertyChanged接口的类,然后在类内,实现PropertyChanged就可以了。
上面介绍消息是用来传递信息的。那么可能会有同学好奇,引用类型的对象不就可以封装传递信息吗?为什么还要用消息呢?
因为有些数据是存储在非引用类型的对象中的。比如字符串,或数字等。
为了让字符串、数字等数据的修改也能如引用类型一样,可以传递回给源,就需要使用消息了。
下面我们来看下消息的基础用法。
首先,我们使用WPF创建一个项目,然后创建一个页面,起名为WindowNotify,编辑内容如下:
接下来,编辑Xaml对于的cs文件,内容如下:
这里我们创建了一个viewmodel——WindowNotifyviewmodel,我们让这个VM继承INotifyPropertyChanged,然后定义了一个Kname属性,并定义了PropertyChanged事件触发的位置。
有同学可能会好奇,PropertyChanged事件是何时被赋值的呢?别心急,请耐心往下看。
viewmodel定义完成之后,我们再看Xaml对应的cs文件。这里我们也定义了一个Kname属性。然后初始化时,将cs文件的Kname和VM的Kname分别赋值给前台定义的两个TextBox控件。
这里用vm的Kname属性赋值时,稍微有点特别,稍后再介绍。
然后我们运行页面,并修改两个文本框内的值。再点击查看结果按钮。得到界面如下:
可以从图中看到,界面修改了TextBox的Text属性,WindowNotifyviewmodel的Kname属性对修改的值进行了同步,而WindowNotify的Kname没有同步。
看完结果,我们回过来看下VM的Kname的奇怪赋值方式。我们先看第一句:
Binding bding = new Binding();
这里的Binding是绑定的意思,这行代码很明显是用来定义一个绑定。
绑定是个不好理解的词,我们该如何理解呢?
很简单,我们可以将绑定理解为套索,既然是套索,那么就该有两个属性,一个是套头,一个是套尾。
那么声明了套索之后,我们便需要为套索的索尾赋值了,即数据源的这一方。
代码里,我们通过Binding的Path和Source设置了索尾的数据源和数据源绑定的属性。之后我们还设置了绑定模式是双向绑定,即双方修改都会进行数据传递。
设置好了套索后,我们在让TextBox控件自己转进套头里,并设置了TextBox控件绑定的属性。代码如下:
txtnameNotify.SetBinding(TextBox.TextProperty,bding);
在我们TextBox控件自己转进套头里的时候,会对数据源的PropertyChanged进行赋值,这样我们就实现了字符串数据的传输。
当然,这样赋值看起来比较笨拙。那么有更简便的方法吗。
答案当然是:有。
上面的代码已经实现了viewmodel,那么只要在这个基础上进行优化,即可实现最简单的MVVM的应用。
优化Xaml代码如下:
评论列表(0条)