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

时间:2015-11-20 13:17:41

标签: c# class interface

假设我有一个界面和两个类:

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知道Class1中字符串“Text”的更改时间及其值是什么。

2 个答案:

答案 0 :(得分:4)

一般来说:

你必须使用观察者模式。

制作一个订阅方法,Imyinterface的每个实例都需要知道文本更改应该调用此方法。现在在' Text'更改文本并通知所有订阅者。

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

答案 1 :(得分:0)

添加活动

正如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); }
    }
}

对事件做出反应

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

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控件和主页面类都不需要实现该接口。根据我对你的情况的理解,到目前为止根本不需要界面,但我认为这取决于你还没有告诉我们的其他要求。