我有一个问题:在MVVM中创建ViewModel的最佳位置在哪里?如何?
1)在App.xaml.cs中创建一次作为静态字段,然后通过App?
使用它2)当我导航到这个页面时,总是在Page.cs中创建新的ViewModel?
3)其他选项
答案 0 :(得分:9)
在MVVM中,ViewModel 是应用程序。这意味着我通常只有一个启动ViewModel,它是我的应用程序的入口点,我通常在App.xaml.cs OnStartup
代码中创建一个这样的实例
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
var app = new ShellView();
var context = new ShellViewModel();
app.DataContext = context;
app.Show();
}
每隔一段时间我就有一个应用程序会在启动窗口的构造函数中创建ViewModel,但这并不是首选,因为这意味着如果我有任何启动逻辑,我必须把它放在代码隐藏中查看,我也不喜欢在我的View层中混合应用程序逻辑。
public partial class MainWindow
{
public MainWindow()
{
InitializeComponent();
this.DataContext = new ShellViewModel();
}
}
无论您如何操作,请记住,在使用MVVM时,ViewModel是您的应用程序,而不是您的视图,因此通常您的ViewModel以某种方式连接到启动ViewModel。视图只是用户友好的方式,用户可以与您的应用程序(ViewModels)进行交互。
答案 1 :(得分:1)
你可以使用依赖注入并像这样创建它(假设你正在使用一些DI容器):
public partial class YourView : UserControl
{
public YourView (IYourViewModel viewModel)
{
InitializeComponent();
this.DataContext = viewModel;
}
}
答案 2 :(得分:1)
有不同的方法,取决于你的想法。
我个人总是有一个专门用来创建我需要的所有对象的类,在App.xaml.cs
中调用。
该类基本上执行那些耗时的启动过程,同时显示启动画面。我在这里创建了Views和ViewModel并将它们链接起来
这使我有一个且只有一个点可以创建所有这些链接View-to-ViewModel,即使我添加/删除了某些内容,我也可以轻松回复它。
我不喜欢在每个视图的构造函数中初始化viewModel的方法。假设您的项目中有15个视图,如果要检查所有ViewModel初始化,则可以浏览15个不同的文件。
这是我对此的谦卑参与=)