【问题标题】:C# WPF MVVM | Change Binded to StatusBar VarsC# WPF MVVM |更改绑定到状态栏变量
【发布时间】:2019-12-18 23:11:38
【问题描述】:

所以,我有一个状态栏作为 UserControl。

型号:

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; }
    }

}

例如,我想从其他 ViewModel 更改 Status 变量。 我该怎么做?我见过只有按钮等的例子。

【问题讨论】:

  • 在 MVVM 中,您可以将 ViewModel 相互嵌套。你经常有暴露 VM 的 VM 和 Expose VM's。最高的将成为默认的应用程序视图模型。 |然而,带有快捷方式和消息系统的命令模式也可能是您正在寻找的机器人。
  • VM 的层次结构?)
  • 你使用 Prism.Wpf 吗?
  • 是的,我使用 Prism.Wpf。

标签: c# wpf mvvm statusbar


【解决方案1】:

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

我建议你在两个视图模型之间进行通信。你会发现 Prism 的 event aggregator 或者你可以实现你自己的事件发布-订阅者模型。制作自己的事件发布-订阅模型将帮助您迈出进入design pattern 的第一步。

【讨论】:

    【解决方案2】:

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

    public static class Globals()
    {
        public static StatusBarModel GlobalStatus { get; set; }
    }
    

    然后,只要你想改变它,你就去做

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

    这能满足你的需要吗?

    【讨论】:

    • 在这种情况下,我必须创建一个 StatusBarModel 的实例,否则它会产生异常。它仍然无法正常工作。状态栏没有改变。
    • 我无法强调在这里使用静态是多么糟糕的想法。这是一个非常常见的初学者陷阱。一个实例被分配到的静态字段 - 这与我曾经使用的静态字段一样接近。
    • 这很公平,静态类不适合这种情况。我仍在学习并感谢您的反馈
    猜你喜欢
    • 2017-01-14
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 2023-04-02
    • 2011-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多