修改ViewModel之外的ViewModel属性 - 值不能保存

时间:2013-06-15 23:23:57

标签: c# mvvm unity-container mvvm-light

是否可以通过在代码中的其他位置使用ViewModelLocator实例来修改ViewModel的属性?当我尝试时,我尝试分配的任何值似乎都被丢弃了。

例如,ViewModel,其实例名为" Game"包含在我的ViewModelLocator中。它有一个名为" Test"的字符串属性。当我尝试以这种方式修改它时:

(App.Current.Resources["Locator"] as ViewModelLocator).Game.Test = "Testing";
System.Windows.MessageBox.Show((App.Current.Resources["Locator"] as ViewModelLocator).Game.Test);

ViewModelLocator _viewModelLocator = new ViewModelLocator();

_viewModelLocator.Game.Test = "Testing";
System.Windows.MessageBox.Show(_viewModelLocator.Game.Test);

消息框显示ViewModel本身声明的字符串的值(如果有)。如果在ViewModel中未分配值,则消息框将显示为空。无论哪种方式,他们都不会显示"测试"。

我该如何使这项工作?我使用MVVM Light和Unity。

public class ViewModelLocator
{
    private static Bootstrapper _bootstrapper;

    static ViewModelLocator()
    {
        if (_bootstrapper == null)
            _bootstrapper = new Bootstrapper();
    }

    public GameViewModel Game
    {
        get { return _bootstrapper.Container.Resolve<GameViewModel>(); }
    }
}

public class Bootstrapper
{
    public IUnityContainer Container { get; set; }

    public Bootstrapper()
    {
        Container = new UnityContainer();

        ConfigureContainer();
    }

    private void ConfigureContainer()
    {
        Container.RegisterType<GameViewModel>();
    }
}

2 个答案:

答案 0 :(得分:0)

看起来这是Unity的一个问题。我切换回MVVM Light的SimpleIoc,它可以毫无障碍地工作。

答案 1 :(得分:0)

当您致电Container.RegisterType<GameViewModel>();时,会使用默认生命周期管理器注册类型GameViewModelThe default lifetime manager for the RegisterType method is the TransientLifetimeManager表示每次调用Resolve时都会返回一个新实例。

因此,每次调用Game属性时,都会返回GameViewModel的新实例。对对象的任何修改只会对该对象进行(并且在对象为GC时丢失)。下次调用Game属性时,将返回GameViewModel的新实例。

因此,假设您只需要一个GameViewModel,则应将其注册为单身人士:

private void ConfigureContainer()
{
    Container.RegisterType<GameViewModel>(new ContainerControlledLifetimeManager());
}