【问题标题】:How to stop more than one ViewModel from being created如何阻止创建多个 ViewModel
【发布时间】:2019-05-10 17:33:10
【问题描述】:

我已经使用 MVVM Light 启动了一个项目,并且遇到了一个问题,即一旦创建了一个窗口,就会绑定一个 ViewModel,但是,如果我关闭此窗口并重新打开同一个窗口,则会创建另一个视图模型。

通过调试器,我可以看到代码在与表单交互后循环通过属性和方法。我可以看到许多相同集合/属性/方法的实例被触发。这会在删除项目等之后产生“超出范围”的错误。

*注意:使用 ViewModelLocator,绑定在 XAML 中并从 XAML.cs 文件中完全删除。 ViewModel 没有在其他任何地方引用。

我尝试了以下方法。没有帮助。

(WPF/MVVM) Single Instance In MainViewModel

我应该如何处理以消除多个 ViewModel 和循环属性/方法。方法/属性只能循环一次。

编辑

我已经解决了我的问题。通过在 Windows 资源中引用静态类,我为每个 ListView 创建了一个新实例。从而迫使 ViewModel 循环到满足这些实例的条件,每个表单都使用了一个实例。

通过消除资源并将所有数据移动到 MVVM Light DataService 并使用 System.Threading.Tasks 中的任务,我能够绑定到 ViewModel 中的集合而不是独立实例。不再循环。感谢您的回答。

【问题讨论】:

  • 一种选择是使用以视图模型为中心的设计。如果您只想要一个实例,请不要创建两个。一切都简单得多。
  • 可以使用MVVMLight自带的SimpleIOC。用法在这里回答stackoverflow.com/questions/13795596/…

标签: c# wpf mvvm viewmodel


【解决方案1】:

通常首先使用视图模型和单个窗口应用程序,而不是具有自己的视图模型的多个窗口。

部分原因是用户很容易“丢失”多个窗口。它还关闭了一些共享问题边缘情况,其中您打开了窗口 X,当您打开窗口 Y 时,处理发生冲突。

根据您现在所拥有的,解决此问题的一种简单方法是使用 SimpleIOC 来提供您的视图模型。

SimpleIOC 为您提供任何所需的单例。

您可能已经看过代码:

        SimpleIoc.Default.GetInstance<vmType>();

在这些尖括号内当然有明确的类型。

另一种选择是:

        SimpleIoc.Default.GetInstance(vmType);

其中 vmType 可以是一个变量。一个类型变量,它与您想要的视图模型的 tupe 匹配。

您可以创建一个标记扩展,将类型作为参数并进行调用,返回视图模型。

我没有尝试过,但我认为您甚至不需要使用该语法注册类型。

【讨论】:

  • 不幸的是,我的 ViewModelLocator 已经包含了这个逻辑,这很难理解为什么要创建许多视图模型实例。
【解决方案2】:

您始终可以使用单例设计模式

public sealed class Vm  
{  
    //Private Constructor.  
    private Vm()  
    {  
    }  
    private static Vm instance = null;  
    public static Vm Instance  
    {  
        get  
        {  
            if (instance == null)  
            {  
                instance = new Vm();  
            }  
            return instance;  
        }  
    }  
} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多