Исходный экземпляр вашего NewsServer
объекта не изменился, потому что вы на самом деле его не модифицировали. После вызова вашего конструктора у вас есть следующие три NewsServer
ссылки:
newsServer = original instance
_newsServer = original instance
DataContext = clone of original instance
После нажатия кнопки ОК ссылки будут следующими:
newsServer = original instance
_newsServer = clone of original instance (possibly modified)
DataContext = clone of original instance (possibly modified)
Помните, что объекты являются ссылочными типами, при присваивании _newsServer
вы обновляете только его ссылку, а не значение самого объекта.
Чтобы разрешить обновление самого объекта NewsServer
, на ум приходят две опции, вероятно, существуют и другие, первая, вероятно, самая простая.
- Реализуйте метод
void Update(NewsServer source)
в своем объекте NewsServer
, затем вместо выполнения нового назначения полю _newsServer
вместо этого вызовите метод обновления для него и передайте справочное значение DataContext
.
- Укажите значение
_newsServer
с помощью открытого / внутреннего свойства. Вы можете использовать это с помощью различных механизмов: явное реагирование на событие, которое возникает при изменении значения свойства; привязать к свойству (например, сделать его свойством зависимости или реализовать INotifyPropertyChanged
); или просто ожидайте, что вызывающая сторона получит значение, если и когда метод ShowDialog()
вернется со значением true
.
Обратите внимание, что если вы немного добавите логику к вызывающей стороне, ваш класс диалога может быть проще. В частности, один из подходов состоит в том, чтобы только поддерживать клонированный объект, выставленный вызывающей стороне через свойство (например, полностью избавиться от поля _newsServer
и просто использовать DataContext
). Этот объект будет привязан к элементам диалога, как и раньше. Вызывающая сторона просто получит ссылку на этот экземпляр в результате true
из метода ShowDialog()
.
Например:
NewsServer newsServer = ...;
EditServerDialog editServerDialog = new EditServerDialog(newsServer);
if (editServerDialog.ShowDialog() == true)
{
newsServer = editServerDialog.DataContext;
}
Клонированный объект будет просто игнорироваться вызывающей стороной, если диалог отменяется, и, таким образом, метод ShowDialog()
возвращает false
. Вы можете просто повторно использовать свойство DataContext
, как показано выше, или вы можете создать другое свойство (например, с именем NewsServer
), которое просто возвращает значение свойства DataContext
(то есть, чтобы сделать код немного более понятным в отношении открытого интерфейса класса диалога).