Binding вложенному свойству

199
19 мая 2018, 10:10

Приведу пример кода:

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? Возможно, изначально всё сделано неверно. Подскажите, пожалуйста, решение.

Answer 1

Т.к. у вас 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.

READ ALSO
С# Удалить блок текста заключенный в фигурные скобки с условием

С# Удалить блок текста заключенный в фигурные скобки с условием

Есть лог файл в json форматеМне необходимо удалить лишние строки заключенные в фигурные скобки в которых есть "processName": "GM_Scheduler"

214
Аутентификация сторонних сервисов

Аутентификация сторонних сервисов

Всем привет, у меня имеется клиент серверное приложение на приложение на Aspnet core помимо основного проекта, появилась необходимость добавить...

208
Ошибка MailKit.Security.SslHandshakeException C#

Ошибка MailKit.Security.SslHandshakeException C#

Есть служба, которая мониторит почту, в случае когда приходит письмо, получает вложения и дальше с ними работаетВо время разработки и тестирования...

290
как программно на си шарп закрыть звуковой файл с расширением m4a?

как программно на си шарп закрыть звуковой файл с расширением m4a?

после того как запущен звуковой файл с помощью ProcessStart("D:\prg

194