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
sfinishedrarding
事件绑定到类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#工作。