Можно ли выставлять события объекта-члена класса извне в .NET? - PullRequest
16 голосов
/ 31 августа 2010

Скажем, у меня есть пользовательский элемент управления в ASP.NET, который содержит кнопку:

public class MyUserControl : UserControl {
    private Button btnSave = new Button();
}

Я могу открыть любое свойство кнопки снаружи, создав свойство, указывающее на кнопку:

public string SaveButtonText { 
    get { return btnSave.Text; } 
    set { btnSave.Text = value; } 
}

Итак, я могу сделать это, чтобы установить текст кнопки:

MyControl.SaveButtonText = "hello world";

Есть ли подобная конструкция, которую я могу использовать для представления событий кнопки также и снаружи? Что-то вроде:

public event SaveButtonClick { return btnSave.OnClick; }
...
MyControl.SaveButtonClick += new EventHandler(...);

Ответы [ 2 ]

26 голосов
/ 31 августа 2010

Вы можете сделать что-то подобное, да:

public event EventHandler SaveButtonClick
{
    add { btnSave.Click += value; }
    remove { btnSave.Click -= value; }
}

Однако обратите внимание, что у этого есть один недостаток - аргумент «отправитель», предоставленный обработчикам событий, все равно будет кнопкой сохранения, а не вашим элементом управления… что может не соответствовать ожиданиям подписчика. Альтернативный подход заключается в том, чтобы самостоятельно подписаться на обработчик нажатия кнопки «Сохранить»:

public event EventHandler SaveButtonClick = delegate {};

private void OnSaveButtonClicked(object sender, EventArgs e)
{
    // Replace the original sender with "this"
    SaveButtonClick(this, e);
}
...
btnSave.Click += OnSaveButtonClicked();

Есть и обратная сторона в этом подходе ... у вас всегда будет ссылка от кнопки сохранения на "this", что может повлиять на мусор коллекция. По сути, ваш элемент управления не сможет собирать мусор до тех пор, пока кнопка сохранения также не будет пригодна для сбора мусора. В этом случае я очень сомневаюсь, что это проблема, но о ней стоит знать.

5 голосов
/ 31 августа 2010
    public event EventHandler SaveButtonClick {
        add { btnSave.Click += new EventHandler (value); }
        remove { btnSave.Click-= new EventHandler (value); }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...