Приведу пример кода:
public class Node : INotifyPropertyChanged
{
public ISource Source { get; set; }
public string Name => Source.Setting.Name;
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged([CallerMemberName]string prop = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(prop));
}
}
И привязка:
<TextBlock Margin="3,0,0,0" Text="{Binding Name}" />
Для привязки используется Fody. Проблема в следующем: При изменении внешним кодом значения Source.Setting.Name, Name в классе Node не бросает OnChange() и естественно вьюшка не обновляется. Конечно, можно в xaml сделать привязку к Source.Setting.Name и тогда проблем не будет, но это мне не подходит, поскольку вместо ISource может быть другой класс и свойство Name будет лежать по другому пути.. Так же можно создать событие и бросать его в сеттере свойства Source.Setting.Name, однако хотелось бы избежать подобного.
Вопрос. Как мне вызвать OnChange() у Name при изменении Source.Setting.Name? Возможно, изначально всё сделано неверно. Подскажите, пожалуйста, решение.
Т.к. у вас Source не меняется, рекомендую его фактически неизменяемым и сделать, это позволит оформить подписку один раз в конструкторе (иначе придется отписываться от старого экземпляра и подписываться на новый в сеттере свойства):
public class Node : INotifyPropertyChanged
{
public ISource Source { get; }
...
Теперь, в конструкторе:
public Node(ISource source)
{
Source = source;
Source.Setting.PropertyChanged += (s, args) =>
{
if (args.PropertyName == nameof(ISetting.Name))
OnPropertyChanged(nameof(Name));
};
}
Т.е. мы вручную перехватываем сообщения об изменениях свойства Name в Setting и говорим GUI что надо перечитать и наше Name.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости