Caliburn - PropertyChanged для ребенка ViewModel

Я использую Caliburn и шаблон MVVM в приложении WPF и пытаюсь использовать как можно больше соглашений. Одна проблема, с которой я сталкиваюсь, - это когда мне нужно соединить уведомления об изменении свойств в импортированном классе.

Скажем, у меня есть ViewModel так:

class ViewModelA
{
    private readonly IViewModelB _b;

    public ViewModelA(IViewModelB b)
    {
        _b = b;
    }

    public bool CanGo
    {
        get { return _b.MyBoolProperty; }
    }

    public void Go()
    {
        //Does something here
    }
}

Каков рекомендуемый (правильный) способ вызова NotifyOfPropertyChange(() => CanGo), когда событие PropertyChanged для MyBoolProperty запускается из ViewModelB?

В прошлом я использовал класс типа PropertyObserver для управления этим.

Или я проектирую этот сценарий совершенно неправильно?

1 ответ

Решение

Если ваша "sub"-модель предоставляется с помощью открытого свойства, вы можете использовать DependenciesAttribute для отслеживания изменений:

 
class ViewModelA
{
    public IViewModelB B {get; private set;}

    public ViewModelA(IViewModelB b)
    {
        B = b;
    }

    public bool CanGo
    {
        get { return B.MyBoolProperty; }
    }

    [Dependencies("B.MyBoolProperty")]
    public void Go()
    {
        //Does something here
    }
}

Для правильной работы весь путь свойства должен состоять из уведомляющих объектов. Вы также можете поставить окончательный "*"

[Dependencies("B.*")]

указать, что все свойства B должны вызывать переоценку предусловия; обратите внимание, что "*" действует только в конце правильного пути и только для одного уровня глубины (он не отслеживает изменения в подмоделях B).

Другие вопросы по тегам