Возможно, единственный реальный способ сделать это - создать какой-то компонент-наблюдатель, работающий в отдельном потоке, задачей которого является чтение свойства через определенные промежутки времени и создание события, когда значение свойства изменяется. Конечно, это решение плавает в мутных водах потоков и синхронизации.
Предполагая, что ваше приложение является однопоточным по отношению к этому объекту, ваше самое чистое решение - делать вызовы методов для этого объекта через прокси-объект. Он будет проверять состояние свойства до и после и вызывать событие в случае его изменения.
Вот простой пример того, о чем я говорю:
public class SomeProxy
{
public SomeProxy(ExternalObject obj)
{
_obj = obj;
}
public event EventArgs PropertyChanged;
private bool _lastValue;
private ExternalObject _obj;
protected virtual void OnPropertyChanged()
{
if(PropertyChanged != null)
PropertyChanged();
}
protected virtual void PreMethodCall()
{
_lastValue = _obj.SomeProperty;
}
protected virtual void PostMethodCall()
{
if(_lastValue != _obj.SomeProperty)
OnPropertyChanged();
}
// Proxy method.
public SomeMethod(int arg)
{
PreMethodCall();
_obj.SomeMethod(arg); // Call actual method.
PostMethodCall();
}
}
Очевидно, что вы можете встроить этот шаблон прокси в подходящий объект - вы просто должны знать, что все вызовы должны проходить через прокси, чтобы событие было вызвано, когда вы ожидаете, что оно будет.