从不同的ViewModel提升MVVM属性的最佳方法是什么?

时间:2013-02-08 16:05:44

标签: wpf xaml mvvm properties

在我的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都可以访问的通用属性一样?

由于

3 个答案:

答案 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消息来实现我的目标。再次感谢。