gpt4 book ai didi

具有 MVVM 和用户控件的 WPF 数据绑定(bind)

转载 作者:行者123 更新时间:2023-12-02 07:27:55 26 4
gpt4 key购买 nike

假设我有一个客户窗口显示有关客户的信息,例如姓名、地址和电话号码。在底部有一个他们订单的 DataGrid。当然,Customer 有一个 Orders 属性,所以如果您使用 MVVM,您只需设置:

ItemsSource = "{Binding Customer.Orders}"

但是,现在假设数据网格现在是用户控件的一部分,该控件还包括用于编辑/添加/删除订单的控件。我想在多个地方使用同一组控件,并且我希望所有用于编辑/添加/删除 Order 对象的逻辑都封装在用户控件中。因为我想使用命令而不是事件处理程序,所以我希望用户控件有自己的 View 模型。

现在的问题是:如何将订单从 Customer View 模型传递到 Orders 用户控件的 View 模型?因为 Orders 用户控件将绑定(bind)到 View 模型,所以我不能说:

<local:OrdersUserControl DataContext="{Binding Customer.Orders}" />

因为用户控件有它自己的 View 模型。它期望在那里看到 Customer.Orders,当然它没有。

我猜这是先有鸡还是先有蛋的情况。

我们非常感谢您的帮助。

亚伦

最佳答案

现在是我每周“不要那样做”的回答......

我不能说...因为用户控件有它自己的 View 模型。

我说的

为您的 UserControl 创建 ViewModel 是一种代码味道。

您遇到这个问题是因为那种气味,这应该表明您做错了什么

解决方案是放弃为 UserControl 构建的 VM。如果它包含业务逻辑,则应将其移动到另一个 ViewModel 中的适当位置。

您应该将 UserControl 视为一个更复杂的控件。 TextBox 有自己的 ViewModel 吗?否。您将 您的 VM 的属性绑定(bind)到控件的 Text 属性,并且该控件会在其 UI 中显示您的文本。

MVVM 并不意味着没有代码隐藏。将用户控件的 UI 逻辑放在代码隐藏中。如果它太复杂以至于您需要在用户控件中包含业务逻辑,则表明它包含的范围太广。将其分解为两个或更多。

像这样思考 MVVM 中的 UserControl——对于每个模型,您都有一个 UserControl,它旨在向用户呈现该模型中的数据。您可以在任何您想向用户展示该模型的地方使用它。它需要一个按钮吗?在您的 UserControl 上公开一个 ICommand 属性,并让您的业务逻辑绑定(bind)到它。您的业​​务逻辑是否需要知道内部发生的事情?添加路由事件。

通常,在 WPF 中,如果您发现自己问为什么做某事会带来伤害,那是因为您不应该这样做。

关于具有 MVVM 和用户控件的 WPF 数据绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25795871/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com