如何阻止创建多个ViewModel

时间:2019-05-10 17:33:11

标签: c# wpf mvvm viewmodel

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

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

*注意:使用ViewModelLocator,绑定在XAML内,并且已从XAML.cs文件中完全删除。在其他任何地方未引用的ViewModels。

我尝试了以下操作。没有帮助。

(WPF/MVVM) Single Instance In MainViewModel

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

EDIT

我已经解决了我的问题。通过在Windows资源中引用静态类,我为每个ListView创建了一个新实例。因此,迫使ViewModel循环到满足那些实例的条件,每种形式消耗一个实例。

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

2 个答案:

答案 0 :(得分:1)

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

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

现在,一种简单的解决方法是使用SimpleIOC提供您的视图模型。

SimpleIOC为您提供任何您想要的东西。

您可能已经看过代码了:

        SimpleIoc.Default.GetInstance<vmType>();

在那些尖括号中当然有一个确定的类型。

替代方法是:

        SimpleIoc.Default.GetInstance(vmType);

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

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

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

答案 1 :(得分:1)

您始终可以使用 Singleton设计模式

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