【问题标题】:What would be the best way to raise a MVVM property from a different ViewModel?从不同的 ViewModel 提升 MVVM 属性的最佳方法是什么?
【发布时间】:2013-01-24 10:59:25
【问题描述】:

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

谢谢

【问题讨论】:

    标签: wpf xaml mvvm properties


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        public class SkinContext : ISkinContext {
            private bool _IsSkinNight = true;
            public bool IsSkinNight
            {
                get { return _IsSkinNight; }
                set 
                {
                    _IsSkinNight = value;
        
                    RaisePropertyChanged("IsSkinNight");
                    RaisePropertyChanged("WindowBackColor");
                    RaisePropertyChanged("StyleImage");
                }
            }
        

        然后我在每个需要了解上下文的 ViewModel 中注入这个类并订阅 NotifyPropertyChanged 事件(或您创建的自定义事件):

        public class SomeViewModel {
            public SomeViewModel(ISkinContext context){
                context.OnPropertyChanged += (s,e) => { /*Raise other notification and whatnot*/ }
            }
        }
        

        【讨论】:

        • 谢谢,罗尔。但是,SkinContext 类如何能够在 IsSkinNight 属性中调用 RaisePropertyEvent?
        • 我不确定我是否理解您的问题。 SkinContext 可以引发您想要的任何事件,并且每个引用此 SkinContext 的 ViewModel 都可以订阅这些事件。它与 EventAggregator 的原理相同,但更容易看到 imo 发生了什么
        猜你喜欢
        • 2020-11-26
        • 2013-03-25
        • 1970-01-01
        • 2011-04-25
        • 1970-01-01
        • 2021-08-30
        • 1970-01-01
        • 2011-02-15
        • 1970-01-01
        相关资源
        最近更新 更多