2015-11-20 3 views
3

Скажем, у меня есть интерфейс и два класса:C# - Как общаться между классами, используя интерфейс с одним свойством

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 и каково ее значение.

+3

Использование интерфейса с одним свойством, это будет сложно. Я предполагаю, что вы можете обновить интерфейс ... Вероятно, лучшим подходом было бы объявить событие как часть интерфейса. [Как реализовать события интерфейса] (https://msdn.microsoft.com/en-us/library/ak9w5846.aspx) – spender

+0

Итак, вы хотите, чтобы все и все экземпляры 'Class2'« знали », когда какой-либо« Class1 »меняет его «Текст» и наоборот? – crashmstr

+0

Можете ли вы уточнить: «Я хочу, чтобы Class2 знал, когда строка« Текст »изменяется в Class1 и каково ее значение». Вы хотите, чтобы код в «Class2» запускался путем изменения класса Class1 или просто хотел, чтобы «Class2» всегда имел доступ к последнему значению из «Class1»? Вы хотите, чтобы он тоже работал? –

ответ

0

Добавление события

Как уже упоминалось в комментариях транжира, вы должны добавить текстовую событие изменения в интерфейсе:

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, так и класс главной страницы. Из того, что я понимаю о вашей ситуации, пока нет необходимости в интерфейсе, но я полагаю, это зависит от других требований, о которых вы нам не говорили.

+0

Большое спасибо за вашу помощь. Прошу прощения за поздний ответ, но я отсутствовал на выходные и У меня не было шанса что-либо сделать с кодом. –

4

В целом:

Для этого вы должны использовать шаблон наблюдателя.

Сделайте метод подписки, каждый экземпляр Imyinterface, который должен знать об изменениях текста, должен вызвать этот метод. Теперь в наборе «Текст» измените текст и уведомите всех подписчиков.

См., Например, http://www.dofactory.com/net/observer-design-pattern

+2

Реализация шаблона наблюдателя, когда события первоклассных граждан C# кажутся мне длинными. – spender

+0

Я знаю, но экземпляры этих классов не связаны (за исключением того, что они имеют один и тот же базовый класс/интерфейс. –

Смежные вопросы