将类声明为静态和在app.xaml文件中创建实例有什么区别

本文关键字:创建 文件 实例 区别 什么 xaml app 声明 静态 | 更新日期: 2023-09-27 18:19:31

假设我在WPF中有两个页面,即Page1.xamlPage2.xaml。我有一个名为PageViewModel.cs的视图模型。这两个页面共享相同的视图模型。

我可以通过两种方法编写代码:

Mehod1:

PageViewModel.cs

public static class PageViewModel
{
}

第1.xaml页

<Window.........>
    <Window.DataContext>
        <vm:PageViewModel />
    </Window.DataContext>
</Window>

Page2.xaml

<Window.........>
    <Window.DataContext>
        <vm:PageViewModel />
    </Window.DataContext>
</Window>

应用程序xaml

Default xaml code.

方法2:

PageViewModel.cs

public class PageViewModel
{
}

第1.xaml页

<Window DataContext={StaticResource PageViewModel}>
    ..........
    ..........
</Window>

Page2.xaml

<Window DataContext={StaticResource PageViewModel}>
    ..........
    ..........
</Window>

应用程序xaml

<vm:PageViewModel x:Key="PageViewModel" />

有人能解释一下上述两种方法之间的区别吗?

将类声明为静态和在app.xaml文件中创建实例有什么区别

主要区别在于,在第一个示例中,任何对象或方法都可以访问视图模型、其数据和方法。

在第二个实例中,您有一个实际的实例(尽管包含在一个全局可访问的对象中),因此,尽管的其他对象仍然可以访问它,但它不像"访问静态(读取,全局)实例"那么容易。

两者具有相同的效果,您可以在两个视图之间共享数据。

您可能需要考虑的一个附加选项是将视图模型传递给视图的构造函数。您必须使用代码隐藏,但您可以为两个视图提供对同一视图模型对象的引用,而不需要任何全局变量。

如果这些是子视图,那么您可以执行以下操作:

MainView.xaml.cs
public void MainView()
{
     SubViewModel subVm = new SubViewModel();
     //If you are instantiating your views
     MySubView view1 = new MySubView(subVm);
     MySecondSubView view2 = new MySecondSubView(view2);
     //Otherwise
     view1.DataContext = subVm;
     view2.DataContext = subVm;
}

按照定位器模式的精神,您还可以简单地将子视图的DataContext属性绑定到主视图模型上的SubViewModel属性。

需要注意的一点是,一旦两个子视图都被破坏,视图模型的生存期就会结束。如果您需要更长的生命周期,那么您应该使用后一个选项,并将其指向一个长寿命对象。

一般来说,我会远离static课程。它们使得单元测试和良好的总体设计更加难以实现。如果需要一个singleton,至少要正确实现一个,而不是只使用静态类。

这不会回答你的问题,BradleyDotNET已经做到了,但我在这里忍不住了。

这是一个使用ViewModelLocator的完美例子,请尝试安装GalaSoft MVVM Light之类的框架。你可以使用你的定位器来跟踪你的视图模型,静态视图模型很糟糕(你会遇到很多可以避免的问题)。

我看不出您在哪里声明了静态资源,但我想它在App.xaml中?

查看这篇使用视图模型定位器的帖子,不要被国际奥委会的东西吓到:)。这真的很方便,也是解决问题的好方法。

绑定到someviewmodel,假设vmlocator在App.xaml中定义,并且someviewmodel存在。

DataContext="{Binding Source={StaticResource ViewModelLocator},  Path=SomeViewModel}"

希望有帮助,

干杯Stian