我正试图在一个小型测试WPF应用程序中了解Caliburn.Micro和MVVM。
我有一个自定义用户控件,其中包含一个付款组合框(包含现金,支票,信用),在此组合框旁边,我想根据所选付款类型加载相应的数据输入视图。 例如,如果用户选择现金,也许我只加载带有金额文本字段的视图,但如果用户选择信用,我将加载包含金额,信用卡类型,信用卡号等字段的视图。
Caliburn.Micro能以任何方式帮助解决这个问题吗?我一直想知道这是否是Caliburn.Micro中内置的屏幕和导体功能的用例,但我不确定。如果Caliburn可以帮助视图模型层次结构支持什么?我可以看到有一个PaymentViewModel包含一个PaymentTypeViewModel的实例,但我不知道我如何促进切换PaymentTypeViewModel实例,该实例将以某种方式基于组合框中的当前选择以及加载相关视图对于那个视图模型。
非常感谢任何建议。
答案 0 :(得分:3)
有几种方法可以做到这一点,但使用Caliburn的Conductor
和Screen
类型最有意义。我想有一个问题是,一旦从用户那里获取数据,你将如何处理这些数据?当您在不同屏幕上从用户检索更多信息时,它是否会被持久化或临时存储为应用程序状态?
无论哪种方式,使用单个屏幕导体(Conductor<T>
)都是有意义的,它将保存对三种类型的支付检索屏幕中的每一种的引用。为每个支付屏幕创建一个视图模型和视图,在Conductor
中实例化并存储对每个支持屏幕的引用(或者更好地将这些引用作为依赖项注入到指挥的构造函数中,或者注入实例化它们的工厂类型)。
通过约定,如果调用Payment
,则组合框会自动将所选值绑定到导体上的SelectedPayment
属性。在此媒体资源的设置中,您可以根据ActivateItem
的值在相应的付款视图模型参考上调用SelectedPayment
方法。
据推测,您的导体上会有一个“OK”或类似的按钮,可以从当前活动的模型(ActiveItem
)中检索数据。每个付款视图模型都可以使用GetPaymentDetails
方法实现一个接口,也许这可能会返回一个序列化形式的详细信息,可以保留。
还应该在导体视图中提及(我们假设它叫做ShellView.xaml),您可以使用ContentControl
来显示当前的付款视图模型(并让Caliburn注入适当的视图并进行绑定)被引用为ActiveItem
:
<ContentControl x:Name="ActiveItem" />
请注意,您可能会有点发烧友,并为您的组合框提供Items
的(稍微含糊不清)名称,并将其ItemsSource
绑定到您的付款视图模型的集合,该模型可以是{在Items
上收集{1}}。 Caliburn会自动将所选值(付款视图模型)绑定到导体上的Conductor<T>.Collection.OneActive
属性,因此当您更改组合框值时,当前视图将自动切换。