【问题标题】:How can I pass data from usercontrol to another usercontrol using mvvm如何使用 mvvm 将数据从用户控件传递到另一个用户控件
【发布时间】:2015-08-08 19:09:29
【问题描述】:

例如,我有一个主窗口,上面有一个框架,它绑定到我拥有的所有用户控件的模型。

示例:(基本个人信息)

我有一个用户控件或(view-1)显示我的个人信息数据库中的单个人。

而且我还有一个用户控件或 (view-2) 可以显示我的数据库中的所有人员列表。

问题是我如何从 (view-2) 到 (view-1) 获取单个人的 ID,因为它们也是不同的用户控件和不同的视图模型。

这种情况的最佳方法是什么? TIA。

【问题讨论】:

  • 到目前为止您尝试过什么?你遇到过依赖注入和事件聚合器吗?
  • 你真的需要两个不同的 ViewModel 类吗?从您问题中的信息来看,我还认为让一个 ViewModel 包含一个属性来拥有人员列表和所选人员的属性是合适的。两个视图可以使用相同的 ViewModel 实例。
  • 只是为了为每个视图清晰地分离视图模型。我只是在想,在源代码管理方面,为每个视图设置一个视图模型将是一种很好的方式,易于阅读和维护。只是一个想法。你怎么看?
  • 如果您有特定于一个或另一个视图的命令并且在 ViewModel 中处理,那么您是正确的。在这种情况下,可能会将跟踪所选人员的责任委托给模型。并将相同的模型注入到 ViewModel 类中。这可以通过服务于 MainWindow 的 ViewModel 来完成。
  • 我可以从我的用户控件访问我的 MainWindowViewModel 的模型吗?

标签: c# wpf mvvm user-controls


【解决方案1】:

一个

Usercontrols 是您的Window 的一部分,那么Window 可以是您UserControls 之间的合适连接器。您可以像这样处理这种情况:

  1. WindowA
  2. UserControlPersonList
    • 包括SelectedPersionDependency Property。 SelectedPerson 类型是 model class 或 viewmodel class
  3. UserControlPerson

现在,在 WindowA.xaml 中:

<StackPanel>
    <userControls:UserControlPersonList x:Name="PersonListControl"/>

    <userControls:UserControlPerson DataContext="{Binding ElementName=PersonListControl, Path=SelectedPerson}"/>
</StackPanel>

结果可能是这样的(主从视图):

选择人时需要填写UserControlPersonList的依赖属性SelectedPerson。要执行此操作,您可以使用Command 并更改PersonListViewModel 中的SelectedPerson 属性并将UserControlPersonList 中的SelectedPerson 依赖属性绑定到它或在您的UserControlPersonList 级别中执行此操作,如@ 987654323@.


B

但是,如果您希望在您的 UserControls 中在不同的 Windows 中进行一些全局更改,您可以将 PersonListViewModel 保存在您的程序的所有 Windows 和 Usercontrols 都可以访问的静态属性中,然后创建其中一个event 命名为SelectedPersionChanged。现在在您的UserControls 中,您可以将EventHandler 订阅到SelectedPersionChanged 并更改您的DataContext。 但是当您不再需要 UserControl 以防止内存泄漏时,您必须从 SelectedPersionChanged 取消订阅 EventHandler。

【讨论】:

  • 感谢您的清晰解释。顺便问一下,这是传统方法吗?
  • 第一种方法 (A) 是一种良好、简单且安全的方法。你的代码是最少的,如果你愿意,你可以在你的 ViewModel 中保存选定的人......有时它很有用。第二种方式(B)用于特定模式,如果您的应用程序不需要在不同窗口中的某些用户控件中进行实时更改,我建议您使用第一种方式。
  • 谢谢 RAM 先生.. 但是如何管理控件的导航?我的意思是如何告诉主窗口显示列表或显示选定的人? TIA
  • 全局实例怎么样?在应用程序级别创建视图模型资源?
  • 这可以通过不同的方式进行,您可以创建一个master-detail 视图,就像我添加到答案中的图像一样。或者您可以创建一个PersionDetail Window 并尝试通过将PersionList 用户控件的SelectedPersion 信息传递给它的构造函数来打开它。要实现这种情况,您需要在 PersonList 用户控件中添加一个名为 SelectedPersonChanged 的事件,例如 answer。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-18
  • 2017-07-20
  • 2012-03-21
  • 2013-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多