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).