c# – 导航和重新调整页面/ viewmodel构造函数

前端之家收集整理的这篇文章主要介绍了c# – 导航和重新调整页面/ viewmodel构造函数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用Galasoft Mvvm Light工具包,在 Windows手机的MVVM模式中构建我的应用程序.我必须每个页面都有自己的viewmodel.

用户启动应用程序时,他可以选择新游戏og旋转问题页面.这些页面每个都有一个viewmodel,一切都使用viewmodellocator.然后,当用户再次导航以在新游戏和问题之间进行选择时.视图模型/页面未被删除.这意味着当用户第二次进入问题或新游戏时,不会调用viewmodel的构造函数,这样就不会运行构造函数中的初始化,并且未正确设置视图.

解决方案我试过了

我尝试删除导航中的后台堆栈,例如新游戏或问题的新导航,应该启动新页面,从而调用构造函数.不工作.

在视图中使用加载的事件,并调用构造函数.不工作.

试图跟随
How to reset all instances in IOC Container
但无法让它发挥作用,可能只是我.

有没有人解决这个问题,如果是这样,应该如何解决


在这里你可以找到一个例子.按问题,然后按一下那里的按钮,使用返回键.并再次按下问题.你看到这个数字现在是1,这很容易改变.但是再次按下按钮时会出现错误.突然出现两个弹出窗口.

那么设置viewmodel的正确方法是什么.因为新游戏的视图将在重新加载旧游戏时使用,仅使用其他值,并且当想要开始新游戏时.希望你能理解 :)

此示例仅用于显示每次返回viewmodel页面时弹出窗口计数上升的问题.
https://www.dropbox.com/s/gjbz0l8rmsxqzrd/PhoneApp8.rar

viewmodel定位器
我在我当前的项目中使用了以下代码中看到的三个viewmodel:

using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Ioc;
using Microsoft.Practices.ServiceLocation;

namespace MVVMTestApp.viewmodel
{
public class viewmodelLocator
{
    public viewmodelLocator()
    {
        //Holder styr på viewmodels
        ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);

        //Tilføj linje her for hver viewmodel
        SimpleIoc.Default.Register<Mainviewmodel>();
        SimpleIoc.Default.Register<MainviewmodelTest>();
        SimpleIoc.Default.Register<Menuviewmodel>();
    }

    //Tilføj metode som denne for hver viewmodel
    public Mainviewmodel Map
    {
        get
        {
            return ServiceLocator.Current.GetInstance<Mainviewmodel>();
        }
    }

    public MainviewmodelTest Main
    {
        get
        {
            return ServiceLocator.Current.GetInstance<MainviewmodelTest>();
        }
    }

    public Menuviewmodel Menu
    {
        get
        {
            return ServiceLocator.Current.GetInstance<Menuviewmodel>();
        }
    }

    public static void Cleanup()
    {
            // TODO Clear the viewmodels
    }
}

我已经查看了上面引用的链接,重置了IOC容器中的所有实例.但是不确定密钥是如何工作的,以及如何确保在远离视图时调用清理函数.因为我不想同时清理所有视图模型.

导航和viewmodelbinding

我将viewmodel绑定到视图中

DataContext="{Binding Source={StaticResource Locator},Path=Map}"

我使用NavigationService和backbutton来回导航.从菜单到游戏:

NavigationService.Navigate(new Uri("/View/MainPage.xaml",UriKind.Relative));

并在页面

protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        //e.Content = NavigationMode.New;
        //e.NavigationMode = NavigationMode(
        viewmodel.Mainviewmodel test = new viewmodel.Mainviewmodel();
        GC.Collect();
        base.OnNavigatedTo(e);
    }

从游戏到菜单

protected override void OnNavigatedFrom(NavigationEventArgs e)
    {
        //e.NavigationMode = NavigationMode.
        this.DataContext = null;
        GC.Collect();
        base.OnNavigatedFrom(e);
        //test = null;
    }

菜单中我调用垃圾收集器.可以看出,我打破了MVVM结构以适应问题.

解决方法

viewmodelLocator的属性返回单例.要使属性每次只需编写时返回一个新实例:
private int questCount;

public Question Quest
{
    get
    {
        return ServiceLocator.Current.GetInstance<Question>((++questCount).ToString());
    }
}

但是,它将导致问题viewmodel缓存.您需要通过密切关注您链接的答案来释放未使用的viewmodel.这导致了我对太多代码的看法,以获得简单的结果.您可以使用其他IOC容器代替Windows Phone上的SimpleIoc(如ninjectunity),这可能更适合您的需求.

在一个简单的项目(几页应用程序)中,特别是在没有太多IOC容器经验的情况下,我建议你放弃所有的SimpleIoc连接,只需调用构造函数

public Question Quest
{
    get { return new Question(); }
}

猜你在找的C#相关文章