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