C#WPF MVVM |绑定到StatusBar变量的更改

C#WPF MVVM |绑定到StatusBar变量的更改,c#,wpf,mvvm,statusbar,C#,Wpf,Mvvm,Statusbar,因此,我有一个状态栏作为用户控件 型号: public class StatusBarModel : BindableBase { private string _status; public string Status { get { return _status; } set { _status = value; RaisePropertyChanged("Status")

因此,我有一个状态栏作为用户控件

型号:

public class StatusBarModel : BindableBase
{
    private string _status;
    public string Status
    {
        get { return _status; }
        set
        {
            _status = value;
            RaisePropertyChanged("Status");
        }
    }

    private int _p_value;
    public int P_Value
    {
        get { return _p_value; }
        set
        {
            _p_value = value;
            RaisePropertyChanged("P_Value");
        }
    }

}
视图模型:

 public class StatusBarVM : BindableBase
{
    readonly source.elements.StatusBar.StatusBarModel _model = new source.elements.StatusBar.StatusBarModel();
    public StatusBarVM()
    {
        _model.PropertyChanged += (s, e) => { RaisePropertyChanged(e.PropertyName); };

    }

    public string Status
    {
        get { return _model.Status; }
        set { _model.Status = value; }
    }

    public int P_Value
    {
        get { return _model.P_Value; }
        set { _model.P_Value = value; }
    }

}
例如,我想从其他视图模型中更改状态变量。
我怎么能做到?我见过一些只使用按钮等的示例。

您可以创建一个静态类来保存该值

public static class Globals()
{
    public static StatusBarModel GlobalStatus { get; set; }
}
然后,无论何时你想改变它,你只要做

Globals.GlobalStatus.Status = "something";
Globals.GlobalStatus.P_Value = 14;

这能满足您的需求吗?

有多种方法可以满足您的需求。正如@bitclicker所说,您可以使用保存其值的静态类。但我认为使它成为静态类的原因太多了,因为变量值只能用于两个
viewmodel


我建议您在两个视图模型之间进行通信。您将找到Prism的
事件聚合器
,或者您可以实现自己的事件发布订阅服务器模型。制作自己的事件发布子模型将有助于您进入MVVM中的
设计模式的第一步,您可以将ViewModels相互嵌套。您经常有一些虚拟机,它们通过公开虚拟机来公开虚拟机。最高的将是de fato应用程序视图模型但是,带有快捷方式和消息传递系统的命令模式也可能是您正在寻找的Droid。VM的层次结构?)您使用Prism.Wpf吗?是的,我使用Prism.Wpf。在这种情况下,我必须创建StatusBarModel的实例,否则它会产生异常。但它仍然不起作用。状态栏并没有改变。我只是强调在这里使用静态是多么糟糕。这是一个非常常见的初学者陷阱。一个实例被分配到的静态字段-这几乎是我以前访问过的静态字段。这很公平,在这种情况下,静态类是不合适的。我仍在学习,感谢您的反馈