C#-如何使用具有一个属性的接口在类之间进行通信

本文关键字:之间 通信 接口 何使用 具有一 有一个 属性 C#- | 更新日期: 2023-09-27 18:23:42

假设我有一个接口和两个类:

public interface Imyinterface
{
    string Text { get; set; }
}
public class Class1 : Imyinterface
{
    public string Text { get; set; }
}
public class Class2 : Imyinterface
{
    public string Text { get; set; }
}

"问题"在于这两个阶层之间的沟通。我的意思是-我想让Class2知道字符串"Text"在Class1中何时更改,以及它的值是多少。

C#-如何使用具有一个属性的接口在类之间进行通信

一般情况下:

为此,您必须使用观察者模式。

制作一个subscribe方法,每个需要了解文本更改的Imyinterface实例都应该调用这个方法。现在在"文本"集合中更改文本并通知所有订阅者。

参见例如。http://www.dofactory.com/net/observer-design-pattern

添加事件

正如spender在评论中提到的那样,您应该在界面中添加一个文本更改事件:

public interface IMyInterface
{
    // This event is raised whenever the value of Text is modified:
    event Action<IMyInterface, string> TextChanged;
    string Text { get; set; }
}

实现接口的类应该在其Text属性更改时引发该事件:

public class Class1 : IMyInterface
{
    public event Action<IMyInterface, string> TextChanged;
    protected void RaiseTextChanged(string newValue)
    {
        var handler = TextChanged;
        if (handler != null)
            handler(this, newValue);
    }
    private string _text;
    public string Text
    {
        get { return _text; }
        set { _text = value; RaiseTextChanged(value); }
    }
}

对事件的反应

任何对IMyInterface对象的Text属性的更改感兴趣的代码都可以注册一个事件处理程序:

IMyInterface thing = new Class1();
thing.TextChanged += Thing_TextChanged;
...
void Thing_TextChanged(IMyInterface sender, string newValue)
{
    // Do something with the new value
}

您的特定用例

在您的特定情况下,您将向MainPage.xaml.cs添加以下代码:

// In MainPage's constructor, after the call to InitializeComponent:
popupControl2.TextChanged += PopupControl_TextChanged;
// A separate method in the MainPage class:
private void PopupControl_TextChanged(IMyInterface sender, string newValue)
{
    // Do what needs to be done with the next Text value here
}

请注意,Silverlight控件和主页面类都不需要实现该接口。根据我对您目前情况的了解,根本不需要接口,但我想这取决于您没有告诉我们的其他需求。