【发布时间】:2020-09-19 05:28:39
【问题描述】:
- 我正在编写一个小型科学程序。它有很多变量作为输入。
- 用户必须在窗口(或用户界面)中输入所有输入变量。但是,我无法将所有输入都放在一个窗口 (XAML) 中。因此,我创建了几个视图,用户只需按下 NEXT 按钮即可在下一个视图中输入数据。
- 所有这些视图都有关联的视图模型。它们都继承自基础 ViewModel。
- 所以,我的问题是:我是否在基本 ViewModel 中编写所有变量的属性?像这样:
namespace ScienceProgram
{
public abstract class BaseViewModel : INotifyPropertyChanged
{
#region Usual Boiler-plate stuff for BindableBase
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string name = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
#endregion
#region Properties (All scientific parameters and calculations )
public double ParamA { get; set; }
public double ParamB { get; set; }
// ...
// Lots of parameters //
// ...
public double ParamA23 { get; set; }
public double TotalLength()
{
return ParamA + ParamB + ParamA23;
}
// ...
// Lots of other methods
// ...
#endregion
}
}
- 或者我是否为所有输入参数创建一个单独的类(例如 ScienceParameters.cs)并执行以下操作(这就是我正在做的):
namespace ScienceProgram
{
public abstract class BaseViewModel : INotifyPropertyChanged
{
// Global Parameter // Shared across ViewModels //
public static ScienceParameters scienceParameters = new ScienceParameters ();
#region Usual Boiler-plate stuff for BindableBase
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string name = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
#endregion
}
}
- 我使用的是后一种方法。当用户在文本框中输入数据时,我只是将其存储为:
namespace ScienceProgram
{
public class UserInputView1ViewModel : BaseViewModel
{
#region User Input
private double _paramA;
public double ParamA
{
get { return _paramA; }
set
{
_paramA = value;
OnPropertyChanged("ParamA");
// Store Value //
scienceParameters.ParamA = value;
}
}
}
}
#endregion
- 正确的方法是什么?或者,还有更好的方法?
- 我一直在寻找一些最佳实践,但我一直被定向到 EventAggregator 并使用单例。我不认为我需要那些。
- 我认为解决方案是“将模型传递给视图模型的构造函数。”正如许多人所说。但我对如何做到这一点有点困惑。这不会在每个视图模型中创建一个新实例吗?
- 对不起,如果这听起来像一个愚蠢的问题,但过去一周我一直在寻找一个直接的答案,但还没有找到解决方案。
提前非常感谢。
【问题讨论】:
-
您使用的是静态科学参数。如果您确保将相同的 Viewmodel 实例传递给所有 3 个向导页面(可能是“单例”的意思),则不需要这样做。让每个对话框的 XAML 决定填写 Viewmodel 实例的哪些属性。旁注:我 不是 MVVM 专家,这是评论,而不是答案。但看起来你的 3 个向导页面实际上形成了一个输入对话框,最后只有一个提交。你也可以使用你的 Viewmodel 的一个实例?
-
嗨@Goodies,非常感谢您的回复。对于迟到的回复,我深表歉意。我没有注意到这个评论。事实上,您建议使用使用 3 个不同向导页面的单个 viewModel 真的很棒。这就是我今天正在实施的。我每天都在学习越来越多的 MVVM 模式,我愚蠢地认为“每个视图都需要自己的视图模式”。但是,现在当我阅读您的建议时,我认为它将通过对所有向导页面使用单个视图模型来帮助我构建一个更简洁的程序。这很棒 !我从来没想过这点 !再次感谢!
-
成功moostang..至于术语,也许您甚至可以将由多个页面组成的“向导”视为一个视图!只有 XAML 不支持,它是面向单个窗口的。 ASP.NET 也有类似的约束,它的 .cshtml 文件只定义一页 HTML。但是向导使用超过 1 页 (=window) 的唯一原因是用户清楚。从 MVVM 程序的角度来看,向导是具有单一结果的单一对话框:用户指定的所有参数都在执行中。