【发布时间】:2016-06-10 06:50:09
【问题描述】:
我有一个带有工具栏的复合应用程序,我想让我的模块可以向工具栏添加一些按钮。据我了解,应该使用 RegionManager 来提供这种可能性。
我写了这样的代码:
public class MyModule : IModule
{
private readonly IUnityContainer _container;
public MyModule(IUnityContainer Container) { _container = Container; }
public void Initialize()
{
var regionManager = _container.Resolve<RegionManager>();
regionManager.RegisterViewWithRegion("MainToolbar",
() => new Button
{
Content = "My Button",
Command = new DelegateCommand(/* */)
});
}
}
但根据 MVVM 模式,从代码创建按钮似乎不是一个好主意,尤其是在 Module 类内部。第二个问题是按钮是在其他模块初始化之前创建的,所以我不能引用其他模块注册的服务。
我到底做错了什么?将来自多个模块的操作收集到一个工具栏中的正确方法是什么?
【问题讨论】:
-
使用模型来封装对该按钮执行的操作。使用 DataTemplate 呈现按钮,并将该按钮模型(以及所有其他必要的按钮模型)放入绑定到工具栏的集合中,该集合是 ItemsControl。工具栏将获取集合中的每个按钮模型,找到模板并渲染按钮。那就是MVVM。 编辑其实如果所有的模型共享相同的属性名,你只需要使用ToolBar.ItemTemplate给每个模型绑定一个按钮就可以了。
标签: c# wpf mvvm prism composite-application