我已经使用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;
}
}
}