在我的MainViewModel上,我有一个如下所示的属性:
private bool _IsSkinNight = true;
public bool IsSkinNight
{
get { return _IsSkinNight; }
set
{
_IsSkinNight = value;
RaisePropertyChanged("IsSkinNight");
RaisePropertyChanged("WindowBackColor");
RaisePropertyChanged("StyleImage");
}
}
如您所见,我使用此属性来提升其他属性。它使得更改UI变得更加容易。特别是当我要添加更多项目时。
但是,我在WPF页面上有一个属性,我也需要更新。但由于它位于不同的页面上,因此其ViewModel也是独立的。所以这个属性不能调用它上面的RaisePropertyChanged,并且页面中的属性不能检查IsSkinNight的状态。
那么在不同的ViewModel之间进行交叉的最佳方式是什么?我将添加更多页面。那么有没有办法像所有ViewModel都可以访问的通用属性一样?
由于
答案 0 :(得分:3)
即使我不喜欢使用它,您也可能需要查找EventAgregators。
基本上,您可以在MainViewModel中触发事件,在其他视图模型中,您将能够注册到此agregator的一个或多个事件。
但是,我强烈建议您使用它非常轻松,因为调试起来非常困难,因为在您触发此类事件时没有调用堆栈。
答案 1 :(得分:0)
在这种情况下,我有时会创建一种Context类,以跟踪“全局”属性。这个类必须注册为Singleton。
public class SkinContext : ISkinContext {
private bool _IsSkinNight = true;
public bool IsSkinNight
{
get { return _IsSkinNight; }
set
{
_IsSkinNight = value;
RaisePropertyChanged("IsSkinNight");
RaisePropertyChanged("WindowBackColor");
RaisePropertyChanged("StyleImage");
}
}
然后我在每个需要了解上下文并订阅NotifyPropertyChanged
事件(或您创建的自定义事件)的ViewModel中注入此类:
public class SomeViewModel {
public SomeViewModel(ISkinContext context){
context.OnPropertyChanged += (s,e) => { /*Raise other notification and whatnot*/ }
}
}
答案 2 :(得分:0)
感谢大家的帮助。我根据这里的建议做了一些研究,并且遇到了MVVM消息。
使用this博文,我能够使用MVVM消息来实现我的目标。再次感谢。