0

是否可以通过在代码中的其他位置使用 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>();
    }
}
4

2 回答 2

0

当您调用它时,会使用默认生命周期管理器 Container.RegisterType<GameViewModel>();注册类型。RegisterType 方法的默认生命周期管理器是 TransientLifetimeManager,这意味着每次调用都会返回一个新实例。GameViewModelResolve

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

因此,假设您只想要一个GameViewModel,您应该将其注册为单例:

private void ConfigureContainer()
{
    Container.RegisterType<GameViewModel>(new ContainerControlledLifetimeManager());
}
于 2013-06-17T20:34:24.740 回答
0

看起来这是 Unity 的问题。我切换回 MVVM Light 的 SimpleIoc,它可以顺利运行。

于 2013-06-15T23:45:30.477 回答