2014-10-29 30 views
-1

我有以下问题: 我有一个叫做File的班级,我希望这个班级在发生特殊事件时通知其他班级,但File不应该提及应该通知的班级。我认为这与INotifyPropertyChanged-Interface解决的问题是一样的。我唯一的解决方法是一个静态列表,其中包含应该通知的类的实例以及此类的静态方法,但我认为这不是最明智的方法。 那么,PropertyChanged使用哪个概念?PropertyChanged接口(事件系统)如何工作?

编辑

让我们假设这应反应的类(通知)被调用FileManager,具有所谓的隐式FinishedReading事件和这个类仅实例化一次。 如何将FileManagerFinishedReading-事件绑定到类File的方法FinishReading(),如果File不应该提及FileManager的实例? 我已经尝试通过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() 
     { 
      // 
     } 
    } 
+0

从这里开始阅读:[事件(C#编程指南)](http://msdn.microsoft.com/zh-cn/library/awbftdfh.aspx)。 – Clemens 2014-10-29 08:49:34

+0

@Clemens habe meine Frage editiert,wielöseich mein问题? 编辑我的问题,我该如何解决这个问题? – Feve123 2014-10-29 11:12:38

回答

0

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

解决方法二:

您可以使用文件管理器类的一个工厂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(); 
    } 
} 
+0

我编辑了这个问题。我该如何解决它? – Feve123 2014-10-29 11:13:31

+0

@ Feve123我更新了我的文章 – BendEg 2014-10-29 12:00:13

+0

Danke dir! Ich verwende das Singleton-Muster,istfürmich zwar auch neu,dennoch“einfacher”als das Factory-Konzept。顺便说一下,lernst du C#an der Uni? 英文: 谢谢。 – Feve123 2014-10-29 15:17:58