Чтобы сделать то, что вы пытаетесь сделать, возможно, существует гораздо более простой метод: используйте «измененный» флаг или событие.
Вы можете, если нужно, каскадировать это на многих уровнях пользовательских элементов управления. Просто объявите событие следующим образом:
public class MyControl : Control
{
public MyControl()
{
InitializeComponent();
textBox1.TextChanged += BubbleModified;
// etc.
}
protected void BubbleModified(object sender, EventArgs e)
{
OnModified(e);
}
protected void OnModified(EventArgs e)
{
var handler = Modified;
if (handler != null)
handler(this, e);
}
[Category("Behavior")]
[Description("Occurs when data on the control is modified.")]
public event EventHandler Modified;
}
Затем, на любом уровне, который вам нужно проверить на предмет изменений, зацепите все события.
public class MainForm : Form
{
private bool isDataModified;
public MainForm()
{
InitializeComponent();
textBox1.TextChanged += DataModified;
textBox2.TextChanged += DataModified;
// etc.
userControl1.Modified += DataModified;
userControl2.Modified += DataModified;
// etc.
}
private void DataModified(object sender, EventArgs e)
{
isDataModified = true;
}
}
Тогда все, что вам нужно сделать, это проверить (и сброс) на isDataModified
флаг соответственно.
Это действительно не так много работы, конечно, проще, чем обеспечить, чтобы INotifyPropertyChanged
был реализован для каждого объекта на графике. Помните, что это форма, вам все равно, что объект изменен, вам небезразлично, если пользователь внес изменения, и для этого вы хотите проверить изменения, внесенные с помощью элементов управления.
Да, это не идеально - вы все еще сталкиваетесь с незначительной неприятностью в связи с сообщением о том, что данные были изменены, даже когда пользователь что-то меняет, а затем меняет его.Но я не думаю, что когда-либо слышал об этом жалобу, и использование сериализации в качестве метода сравнения просто не является надежным. То, что вам действительно нужно сделать, если вы хотите устранить избыточное подтверждение сохранения, переопределяет метод Equals
каждого объекта на графике и реализует действительную операцию равенства по значению. Или, если вы не хотите сохранять копию старого графика, используйте функцию генерирования контрольной суммы (коллизии возможны, но очень маловероятны).
Но я бы просто придерживался флага. Не пытайтесь обмануть свой путь от написания проверок равенства. На самом деле это похоже на попытку написать автоматический метод глубокого клонирования; вы можете попробовать, но все, что вы придумали, будет сломан иногда.
Спасибо за все ответы, я знаю метод IsDirty, но мне просто интересно, есть ли другой способ сделать это. Теперь мне интересно, если бы я сериализовал объекты в XML, это было бы более надежным методом. – sev7n