PropertyChanged接口(事件系统)是如何工作的
本文关键字:工作 何工作 接口 事件系统 PropertyChanged | 更新日期: 2023-09-27 18:28:10
我有以下问题:我有一个名为File
的类,我希望这个类在发生特殊情况时通知另一个类,但File
不应该引用应该通知的类。我认为这和INotifyPropertyChanged
-接口解决的问题是一样的。我唯一的解决方法是一个静态列表,其中包含应该通知的类的实例和该类的静态方法,但我认为这不是最明智的方法。那么,PropertyChanged
使用了哪个概念呢?
编辑:
让我们假设应该做出反应(被告知)的类被称为FileManager
,具有一个名为FinishedReading
的隐式事件,并且这个类只实例化了一次。如果File
不应该引用FileManager
的实例,我如何将FileManager
的FinishedReading
-事件绑定到类File
的方法FinishReading()
?我已经尝试将FileManager
的Event作为参数传递,但没有成功。
示例:
[global::Microsoft.VisualStudio.TestTools.UnitTesting.TestClass]
public class FileManager
{
public delegate void MyDelegate();
public event MyDelegate FinishedReading;
}
[global::Microsoft.VisualStudio.TestTools.UnitTesting.TestClass]
public class File
{
// Whats the exact Data-Type of the FinishedReading-Event?
public File(FileManager.MyDelegate eventInstance)
{
eventInstance += FinishReading;
}
public void FinishReading()
{
//
}
}
在这种情况下,我将处理事件,而不是一些静态方法。INotifyPropertyChanged
是一种监听系统。WPF系统检查绑定的类是否来自INotifyPropertyChanged
,并在需要时调用方法PropertyChanged
。
第一个解决方案:
好的,在这种情况下,我会使FileManage成为一个单例,但您只有一个实例。在文件中,您可以调用FileManage.Singleton.FinishReading()
或类似的名称。
public class FileManager
{
private static readonly FileManager singleton = new FileManager();
public static FileManager Singleton
{
get { return FileManager.singleton; }
}
private FileManager()
{
}
public void FinishReading()
{
}
}
public class File
{
public void FinishReading()
{
//
FileManager.Singleton.FinishReading();
}
}
第二个解决方案:
您可以将FileManager类用作File
的工厂,并将委托设置为FinishReading()
。然后你就有了一个很好的界面来创建文件,而不必关心传递正确的参数。
public class FileManager
{
public FileManager()
{
}
public File CreateFile()
{
File f = new File(this.FinishReading);
return f;
}
public void FinishReading()
{
}
}
public class File
{
public delegate void FinishReadingDelegate();
private FinishReadingDelegate del;
public File(FinishReadingDelegate Del)
{
del = Del;
}
public void FinishReading()
{
//
del.Invoke();
}
}