Wpf 在视图中访问ViewModel数据
我只是想问一下,在Wpf 在视图中访问ViewModel数据,wpf,mvvm,Wpf,Mvvm,我只是想问一下,在视图后端访问视图模型的数据是否可以 基本上,我只需要检查查看ViewModel的属性是否已设置(当用户选择某个对象时设置该属性),如果未设置,我只需将用户重定向到另一个视图告诉他需要先选择某个对象。这是一个糟糕的设计实践,还是仅仅为了这样一个小检查就可以了?我真的不想实现一个静态类并将数据外推到它,而是检查它 与此密切相关的另一个问题是,我是否可以从视图调用一个方法(当视图关闭时),该方法从IoC容器中注销特定的视图模型(此视图模型不是单例)。另一种方法是,当视图关闭时,从视图
视图
后端访问视图模型的
数据是否可以
基本上,我只需要检查查看ViewModel的
属性是否已设置(当用户选择某个对象时设置该属性),如果未设置,我只需将用户重定向到另一个视图
告诉他需要先选择某个对象。这是一个糟糕的设计实践,还是仅仅为了这样一个小检查就可以了?我真的不想实现一个静态类并将数据外推到它,而是检查它
与此密切相关的另一个问题是,我是否可以从视图
调用一个方法(当视图
关闭时),该方法从IoC容器中注销特定的视图模型
(此视图模型
不是单例)。另一种方法是,当视图
关闭时,从视图向视图模型
发送一条消息,当视图模型
收到该消息时,它会自行注销。我试图解决的问题是,每次请求ViewModel
时,它都必须是一个新的,但我的IoC容器会缓存它们,使我的程序成为内存占用者。所有ViewModels
在应用程序退出时被释放,这意味着xViewModels
仍将存在于缓存中,即使它们很可能不需要
基本上,我只需要检查查看ViewModel的
属性是否已设置(当用户选择某个对象时设置该属性),如果未设置,我只需将用户重定向到另一个视图
告诉他需要先选择某个对象。这是一个糟糕的设计实践,还是仅仅为了这样一个小检查就可以了
检查某些ViewModel
属性的值并在View
侧反映更改似乎没有错。视图
状态可以通过WPF数据绑定机制“绑定”到视图模型
状态:绑定
,触发器
(触发器
,数据触发器
,事件触发器
),命令
(包括事件命令
)等
但有时,通过ViewModel
本身使用UI服务处理ViewModel
状态更改是很有用的。例如,可以引入IWindowService
接口,以允许从ViewModel
实现的上下文中打开窗口
与此密切相关的另一个问题是,我是否可以从视图
调用一个方法(当视图
关闭时),该方法从IoC容器中注销特定的视图模型
(此视图模型
不是单例)
我试图解决的问题是,每次请求ViewModel
时,它都必须是一个新的,但我的IoC容器会缓存它们,使我的程序成为内存占用者。所有ViewModels
在应用程序退出时被释放,这意味着xViewModels
仍将存在于缓存中,即使它们很可能不需要
奇怪的是,当注册被指定为“每次调用解析行为”(而不是“单例行为”)时,所描述的依赖项容器“缓存效果”就存在了。请检查注册是否指定为“解析每次调用行为”(例如,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
以支持“解析每次调用行为”。我建议使用另一个依赖项注入容器。请看。