Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# PropertyChanged接口(事件系统)是如何工作的?_C#_Wpf_Propertychanged - Fatal编程技术网

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

C# PropertyChanged接口(事件系统)是如何工作的?,c#,wpf,propertychanged,C#,Wpf,Propertychanged,我有以下问题: 我有一个名为File的类,我希望这个类在发生特殊事件时通知另一个类,但是File不应该引用应该通知的类。我认为这与INotifyPropertyChanged接口解决的问题相同。我唯一的解决方法是一个静态列表,其中包含应该通知的类的实例和这个类的静态方法,但我认为这不是最聪明的方法。 那么,PropertyChanged使用哪个概念呢 编辑: [global::Microsoft.VisualStudio.TestTools.UnitTesting.TestClass]

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

编辑

    [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()
        {
            //
        }
    }
让我们假设应该做出反应(被通知)的类被称为
FileManager
,它有一个隐式事件,名为
finishedrarding
,并且这个类只被实例化一次。 如果
File
不应引用
FileManager
的实例,如何将
FileManager
s
finishedrarding
事件绑定到类
File
的方法
FinishReading()
? 我已经尝试将
FileManager
s事件作为参数传递,但没有成功

示例

    [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

第一个解决方案

    [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()
        {
            //
        }
    }
好的,在本例中,我将使FileManager成为一个单例,但您只有一个实例。您可以在文件中调用
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类用作
文件的工厂,并将委托设置为
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();
    }
}

从这里开始读:。@Clemens habe meine Frage editiert,我有什么问题吗?编辑我的问题,我该如何解决这个问题?Danke dir!我是单身人士,这是一家工厂。顺便说一句,你是大学校长吗?L1:谢谢。@Feve123我也是德国人,但我建议你用英语写:)最好是你自己学,也许试着出错。我从2005年起就在C#工作。