在View中访问ViewModel数据

时间:2015-05-05 18:26:09

标签: wpf mvvm

我只想询问是否可以访问ViewModel's后端中的View数据?

基本上我只需要检查是否设置了ViewModel's属性(当用户选择某个内容时会设置),如果不是,我只是将用户重定向到另一个View告诉他他需要先选择一些东西。这是一个糟糕的设计实践还是没关系,只是为了这样的小检查?真的不想实现静态类并将数据外推到它,而是检查它。

与此密切相关的另一个问题是,我可以从View(当View关闭时)调用一个方法,从IoC容器中取消注册该特定ViewModel(这ViewModel不是单身人士)。另一种方法是在ViewModel关闭时将视图中的消息发送到View,当ViewModel获取该消息时,它会取消注册。我试图解决的问题是,每次请求ViewModel时它都必须是一个新的,但我的IoC容器会缓存它们,使我的程序成为内存耗尽。所有ViewModels都会在应用程序退出时释放,这意味着即使很可能不需要x ViewModels,它们仍然存在于缓存中。

1 个答案:

答案 0 :(得分:1)

  

基本上我只需要检查是否设置了ViewModel's属性(当用户选择某个内容时会设置),如果不是,我只是将用户重定向到另一个View告诉他他需要先选择一些东西。这是一个糟糕的设计实践还是没关系,只是为了这样的小检查?

检查某些ViewModel属性的值并反映View方面的更改似乎没有错。 WPF数据绑定机制可以将View状态“绑定”到ViewModel状态:BindingTriggersTriggerDataTriggerEventTrigger),Commands(包括EventToCommand)等

但有时使用UI服务来处理ViewModel本身的ViewModel状态更改很有用。例如,可以引入IWindowService接口以允许从ViewModel实现的上下文中打开窗口。

  

与此密切相关的另一个问题是,我可以从View(当View关闭时)调用一个方法,从IoC容器中取消注册该特定ViewModel(这ViewModel不是单身人士。)

     

...

     

我试图解决的问题是,每次请求ViewModel时它都必须是一个新的,但我的IoC容器会缓存它们,使我的程序成为内存耗尽。所有ViewModels都会在应用程序退出时释放,这意味着即使很可能不需要x ViewModels,它们仍然存在于缓存中。

当注册被指定为“每次呼叫行为的解决”(而不是“单身行为”)时,所描述的依赖性容器“缓存效应”似乎很奇怪。请检查注册是否已指定为“按呼叫行为解析”(例如,Unity Container Lifetime Managers中的PerResolveLifetimeManager)。

更新

存在ViewModel生存期问题,因为使用了SimpleIoC容器。 我想建议使用另一个依赖注入容器(具有适当的生命周期管理),以使实现不那么复杂和容易出错。

但是,如果强烈需要使用SimpleIoC容器,可以使用以下方式实现某种ViewModel生命周期管理:

  • SimpleIoc.Default.GetInstance<ViewModel>(key);方法调用以解析ViewModel;
  • 的实例
  • SimpleIoc.Default.Unregister(key);在不再需要实例(Closed事件等)时取消注册该实例。

可以在此处找到实施:answer #1answer #2