ResizeOptions
это просто класс, который содержит значения.Даже если вы используете его в связи с Form
, у него нет «осознания» того, что оно используется внутри формы, и не должно.Не нужно знать, что когда его значения меняются, где-то существует форма, в которой должен быть вызван метод Invalidate()
.
Более того, как мы можем быть уверены, что существует форма для аннулирования?Мы могли бы сделать это:
var resizeOptions = new ResizeOptions();
Теперь формы вообще нет.Если бы мы могли как-то вызвать Invalidate()
из этого класса, он бы стал недействительным?
Что он может сделать, это, когда его значения изменились, вызвать событие, которое говорит: «Здравствуйте, мои значения изменились!"и тогда другие компоненты, такие как форма, могут решить, что они должны делать с этой информацией.
Для этого вы можете создать делегата:
public delegate void ResizeOptionsChangedEventHandler(ResizeOptions sender);
Добавить событие в ResizeOptions
:
public event ResizeOptionsChangedEventHandler ResizeOptionsChanged;
Поднимите его, когда вам нужно:
public bool ResizeTop
{
get { return resizeTop; }
set
{
resizeTop = value;
ResizeOptionsChanged?.Invoke(this);
}
}
Теперь ResizeOptions
сделал свое дело, сообщив всем, кому небезразлично, что оно изменилось.То, что делает другой класс с этой информацией, зависит от этого другого класса.
Теперь в своей форме вы можете подписаться на событие в конструкторе:
public CustomForm()
{
// other constructor stuff
resizeOptions.ResizeOptionsChanged += ResizeOptions_ResizeOptionsChanged;
}
ив свойстве:
public ResizeOptions ResizeOptions
{
get { return resizeOptions; }
set
{
if (resizeOptions != null)
resizeOptions.ResizeOptionsChanged -= ResizeOptions_ResizeOptionsChanged;
resizeOptions = value;
resizeOptions.ResizeOptionsChanged += ResizeOptions_ResizeOptionsChanged;
this.Invalidate(true);
}
}
с помощью этого обработчика события:
private void ResizeOptions_ResizeOptionsChanged(ResizeOptions sender)
{
Invalidate(true);
}