如何阻止多个ViewModel被创建



我已经使用MVVM Light启动了一个项目,并遇到了一个问题,一旦创建了一个窗口,就可以绑定一个viewModel,但是,如果我关闭此窗口并重新打开相同的窗口窗口另一个ViewModel。

通过调试器,我可以在与表单交互后看到代码通过属性和方法循环。我可以看到许多相同集合/属性/方法正在驱动的实例。然后,这会在删除项目等之后造成"超出范围"的错误

*注意:使用ViewModelocator,绑定在XAML内,并完全从XAML.CS文件中删除。ViewModels在其他任何地方都没有引用。

我尝试了以下内容。没有帮助。

(WPF/MVVM(MainViewModel中的单个实例

我应该如何处理以消除多个视图模型和循环属性/方法。方法/属性应仅循环一次。

edit

我解决了问题。通过在Windows Resources中引用一个静态类,我正在每个ListView创建新实例。因此,迫使ViewModel循环到条件,以符合那些消耗实例的每个形式的实例。

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

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

部分是因为用户很容易"丢失"多个窗口。它还关闭了许多共享的问题边缘案例,您的窗口x打开,当您打开窗口时,处理冲突。

使用您现在拥有的东西,这是一种简单的方式,就是使用Simpleioc提供您的ViewModels。

SimpleIoc为您提供的任何要求。

您可能已经看到代码确实:

        SimpleIoc.Default.GetInstance<vmType>();

当然,哪个角度括号内有明确的类型。

替代方案是:

        SimpleIoc.Default.GetInstance(vmType);

vmtype可以是变量。与您想要的ViewModel的Tupe匹配的类型变量。

您可以制作一个标记扩展名,该扩展名将类型作为参数并进行呼叫,返回ViewModel。

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

您始终可以使用 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;  
        }  
    }  
} 

相关内容

  • 没有找到相关文章