0

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

谢谢

4

3 回答 3

3

即使我不喜欢使用它,您也可能需要查找 EventAgregators。

基本上,您将能够在 MainViewModel 中触发一个事件,并且在您的其他视图模型中,您将能够注册到此聚合器的一个或多个事件。

但是,我强烈建议您非常轻松地使用它,因为它会变得非常难以调试,因为当您触发这样的事件时没有调用堆栈。

于 2013-02-08T16:09:52.863 回答
0

在这种情况下,我有时会创建一种 Context 类来跟踪“全局”属性。这个类必须注册为单例。

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*/ }
    }
}
于 2013-02-08T16:37:23.577 回答
0

感谢大家的帮助。根据此处的建议,我进行了更多研究,并遇到了 MVVM 消息。

使用这篇博文,我能够使用 MVVM 消息来实现我的目标。再次感谢。

于 2013-02-08T18:07:49.697 回答