PropertyChanged接口(事件系统)是如何工作的

本文关键字:工作 何工作 接口 事件系统 PropertyChanged | 更新日期: 2023-09-27 18:28:10

我有以下问题:我有一个名为File的类,我希望这个类在发生特殊情况时通知另一个类,但File不应该引用应该通知的类。我认为这和INotifyPropertyChanged-接口解决的问题是一样的。我唯一的解决方法是一个静态列表,其中包含应该通知的类的实例和该类的静态方法,但我认为这不是最明智的方法。那么,PropertyChanged使用了哪个概念呢?

编辑

让我们假设应该做出反应(被告知)的类被称为FileManager,具有一个名为FinishedReading的隐式事件,并且这个类只实例化了一次。如果File不应该引用FileManager的实例,我如何将FileManagerFinishedReading-事件绑定到类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()
        {
            //
        }
    }

PropertyChanged接口(事件系统)是如何工作的

在这种情况下,我将处理事件,而不是一些静态方法。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();
    }
}