是否可以通过在代码中的其他位置使用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>();
}
}
答案 0 :(得分:0)
看起来这是Unity的一个问题。我切换回MVVM Light的SimpleIoc,它可以毫无障碍地工作。
答案 1 :(得分:0)
当您致电Container.RegisterType<GameViewModel>();
时,会使用默认生命周期管理器注册类型GameViewModel
。 The 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());
}