我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。
这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。
源码指引:github源码指引_初级代码游戏的博客-CSDN博客
C#是我多年以来的业余爱好,新搞的东西能用C#的就用C#了。
本文面向从C++转过来的程序员。
上一篇我们遇到了Title不用于单向绑定的问题。之前我们在解决列表数据变化时自动通知的时候已经遇到了同样的问题。
所以一切的根源都在于变化通知的实现不是自动的,而是通过“父对象”的INotifyPropertyChanged接口来实现的。
目录
一、INotifyPropertyChanged
INotifyPropertyChanged并不神秘,只包含一个事件(event)。而事件,其实就是函数指针(函数指针的类型在C#则叫做“代理”)。
INotifyPropertyChanged 所需的事件类型为:
delegate void PropertyChangedEventHandler(object? sender, PropertyChangedEventArgs e);
所谓订阅通知就是把自己的处理方法加入到对象的事件的处理链里面。
而对象实现属性变化通知的方法就是在每个属性的set方法里执行处理链。
二、实现样板
上一篇遇到的Title不能单向绑定就是因为父对象不支持变化通知,所以没法实现。我们可以自己写个类,实现变化通知:
public class MyTitle : INotifyPropertyChanged
{
String _myTitle="";
public String myTitle { get { return _myTitle; } set { _myTitle = value; OnPropertyChanged(); } }
public event PropertyChangedEventHandler? PropertyChanged;
public void OnPropertyChanged([CallerMemberName] string propertyName = "")
{
// Raise the PropertyChanged event, passing the name of the property whose value has changed.
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
这就是一个最简单的变化通知的样板。OnPropertyChanged完全是为了方便的,像这样只有一个属性的,直接在set里面写就行了。
在窗口类里面定义对象:
MyTitle myTitle= new MyTitle();//作为绑定源的应用名称
在窗口类构造函数里初始化:
myTitle.myTitle = app_title;
三、使用绑定
在xaml文件里使用绑定:
注意做了两处绑定,因为之前自定义了标题栏,现在把使用完全自定义标题栏的语句禁用掉,这样就能看到两个标题栏的内容:
看看效果:
两个绑定都是生效的。
(这里是文档结束)