Wpf 在视图中访问ViewModel数据

Wpf 在视图中访问ViewModel数据,wpf,mvvm,Wpf,Mvvm,我只是想问一下,在视图后端访问视图模型的数据是否可以 基本上,我只需要检查查看ViewModel的属性是否已设置(当用户选择某个对象时设置该属性),如果未设置,我只需将用户重定向到另一个视图告诉他需要先选择某个对象。这是一个糟糕的设计实践,还是仅仅为了这样一个小检查就可以了?我真的不想实现一个静态类并将数据外推到它,而是检查它 与此密切相关的另一个问题是,我是否可以从视图调用一个方法(当视图关闭时),该方法从IoC容器中注销特定的视图模型(此视图模型不是单例)。另一种方法是,当视图关闭时,从视图

我只是想问一下,在
视图
后端访问
视图模型的
数据是否可以

基本上,我只需要检查查看
ViewModel的
属性是否已设置(当用户选择某个对象时设置该属性),如果未设置,我只需将用户重定向到另一个
视图
告诉他需要先选择某个对象。这是一个糟糕的设计实践,还是仅仅为了这样一个小检查就可以了?我真的不想实现一个静态类并将数据外推到它,而是检查它

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

基本上,我只需要检查查看
ViewModel的
属性是否已设置(当用户选择某个对象时设置该属性),如果未设置,我只需将用户重定向到另一个
视图
告诉他需要先选择某个对象。这是一个糟糕的设计实践,还是仅仅为了这样一个小检查就可以了

检查某些
ViewModel
属性的值并在
View
侧反映更改似乎没有错。
视图
状态可以通过WPF数据绑定机制“绑定”到
视图模型
状态:
绑定
触发器
触发器
数据触发器
事件触发器
),
命令
(包括
事件命令
)等

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

与此密切相关的另一个问题是,我是否可以从
视图
调用一个方法(当
视图
关闭时),该方法从IoC容器中注销特定的
视图模型
(此
视图模型
不是单例)

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

奇怪的是,当注册被指定为“每次调用解析行为”(而不是“单例行为”)时,所描述的依赖项容器“缓存效果”就存在了。请检查注册是否指定为“解析每次调用行为”(例如,
PerResolveLifetimeManager
中的)

更新 由于使用了SimpleIoC容器,因此存在
ViewModel
生存期问题。 我建议使用另一个依赖项注入容器(具有适当的生命周期管理),以降低实现的复杂性和易出错性

但是,若有strong使用SimpleIoC容器的需求,可以使用以下方法实现某种
ViewModel
生命周期管理:

  • SimpleIoc.Default.GetInstance(键)方法调用以解析
    ViewModel
    的实例
  • simpleoc.Default.Unregister(键)
    在不再需要实例时取消注册该实例(
    关闭
    事件等)

可以在这里找到实现:,。

我使用的是Mvvm Light中包含的SimpleIoC。真是赤裸裸。除了立即创建/第一次调用外,不能指定其他行为。它有我需要的一切,加上我在应用程序中使用Mvvm Light,其他依赖项容器库似乎增加了不必要的复杂性(在我的项目范围内)@RexGrammer,你能发布源代码来演示SimpleIoC是如何使用的吗?你创建一个静态类作为ViewModelLocator,将它添加到应用程序资源中。ViewModelLocator的构造函数:
ServiceLocator.SetLocatorProvider(()=>SimpleIoc.Default)
simpleoc.Default.Register()
然后只需公开一个属性
public MainViewModel Main{get{return ServiceLocator.Current.GetInstance();}}
,将视图的datacontext绑定到该属性。(包括示例)SimpleIoC似乎非常简单,因为“缓存”(作为限制)而引入了复杂性:需要注册和取消注册
ViewModels
以支持“解析每次调用行为”。我建议使用另一个依赖项注入容器。请看。