Начиная с первоначального ответа Майка, я смог найти следующее решение.
Фон
- Клиент извлекает данные с сервера через службу WCF.
- Ссылка на службу WCF создается Visual Studio с "повторным использованием типов в ссылочных сборках", поэтому манипулирование прокси WCF невозможно.
- Свойство в приложении на стороне клиента необходимо изменить, когда изменилось какое-либо свойство любого из объектов, полученных из WCF (эти объекты реализуют INotifyPropertyChanged)
заблаговременности
Я понимаю, что это нарушает некоторые объектно-ориентированные правила и правила ответственности, однако решение настолько короткое, настолько простое и соответствует моим текущим и ожидаемым будущим потребностям, поэтому я выбрал именно это. Это решение менее практично, когда при каждой десериализации на стороне клиента требуется существенная логика.
[DataContract]
public class DataTransferObject : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
[OnDeserialized]
public void OnDeserialized(StreamingContext context)
{
dynamic app = Application.Current;
if(app != null) //Prevents execution on server-side. This code is meant to only execute at the client
{
PropertyChanged += (sender, args) =>
{
app.IsAnythingDirty = true;
};
}
}
}
Ключи
- Причиной этого является динамическое ключевое слово. Вы должны использовать
динамическое ключевое слово, потому что проект, содержащий DTO, не может ссылаться на
Пользовательский интерфейс проекта из-за циклической ссылки. Если он не может ссылаться на проект пользовательского интерфейса, то компилятор не знает о логическом значении IsAnythingDirty.
- Проверка того, имеет ли значение Application.Current значение NULL, гарантирует, что код будет выполняться только на стороне клиента, а не на стороне сервера.