【问题标题】:Dynamically Load UserControl using MVVM Light Toolkit使用 MVVM Light Toolkit 动态加载 UserControl
【发布时间】:2011-06-07 06:31:29
【问题描述】:

我搜索了这个网站,发现了 2 个链接
how to load wpf usercontrol in MVVM pattern

MVVM-Light: Load UserControl into Window

但我仍然找不到我的问题的答案和这个链接

MVVM-Light Locator Pattern and Reusable UserControl

我不明白....所以我在这里陈述我的问题,这可能会帮助像我一样挣扎的其他人......

我有一个MainWindow,它有两个部分,一个有一个TreeView(a UserControl) 和其他显示不同的用户控件(名为 DisplayPanel).... 就像 windows 资源管理器一样。

右侧的显示面板将在树状视图的单击节点上显示不同的用户控件。

而我的TreeView 本身就是一个用户控件。

如何使用MVVM 使这个复合 UI 工作。我也计划使用MVVM light Toolkit。这有什么可以帮助的吗...

一个例子会很棒

谢谢... :)

编辑

我在 UserControl 中的 TreeView 我在 UserControl 中创建了一个依赖属性,它捕获树视图中的选定项,以便我可以使用此依赖属性在“MainView”中填充所需的视图ContentControl绑定....正如您在 cmets 中建议我的那样。一切都到了现在

问题是我想显示所选项目中包含的数据,并且我无法将 UserControls(将显示在右侧)的 DataContext 设置为所选项目,因为这样我将无法使用我的用于命令和其他操作的相应用户控件的视图模型

我也尝试解决这个问题....我在 TreeViewUserControl 视图模型中使用了调解器(信使)向用户控件(我需要显示的那个)视图模型发送消息。每当在树视图中选择项目时都会传递消息。并且消息包含选定的节点。我忘了提到我将 UserControl 的 datacontext 设置为其视图模型,以便我可以显示数据

但是使用这种方法的问题是,当我第一次单击一种类型的节点时,数据不会被填充,但如果再次单击相同类型的节点,它会被填充。发生的情况是,当第一次单击树项并且 Mediator 发送消息时,UserControls 对象可用。所以 Mediator 无法将消息传递给 userControl 视图模型.....

我完全没有想法进一步解决这个问题....如果显示用户控制权是我的方式,或者我应该做其他事情....完全混淆.....

【问题讨论】:

  • 这可能与 MVVM 或我们必须打破模式并使用背后的代码......。我今天搜索了一整天,但没有找到有用的东西。 :(
  • 我并没有专门与 MVVM 轻型工具包相关联......我可能是一个解决方案......如果我能得到一个,因为它不会让我完成我开始的工作...... :(

标签: wpf data-binding mvvm-light dynamic-usercontrols


【解决方案1】:

您可以尝试为 TreeView 的 ItemsSource 中的每种类型定义一个 DataTemplate,而不是在右侧使用特定的 UserControl,只需绑定到 TreeView 的 SelectedItem。或者,您可以使用DataTemplateSelector。

为 OP 的编辑编辑
你做了这个了吗?

  • MainWindow 拥有 TreeView,其 ItemsSource=Binding MainVM.Items。
  • MainWindow 拥有 ContentControl,其 Content=Binding TreeView.SelectedItem。
  • 在项目的某个地方,有ResourceDictionary,MainVM.Items 中的每个可能类型都定义了一个 DataTemplate?

您尝试使用哪个 ViewModel(MainVM 或 ItemVM),为什么不能使用?

【讨论】:

  • 如果我理解正确..... DataTemplateSelector 将根据与所选项目的绑定自动为我选择视图...???
  • 怎么做的......???我所有的视图都是将显示在右侧的用户控件....每个用户控件都有自己的功能...我只需要使用正确的选定节点加载正确的视图...
  • 就我个人而言,我会这样做:对于 treeView.ItemsSource 中的每种可能类型,定义一个 DataTemplate(在 ResourceDictionary 中),然后在右侧有一个 ContentControl Content=Binding treeView.SelectedItem。在 ResourceDictionary 中为 type 定义了 DataTemplate,当 WPF 看到 type 时,它会自动创建它应该看起来的样子(来自 DataTemplate)。
  • 您好,我尝试了您的解决方案,它在一段时间内对我来说效果很好,直到我遇到问题.... 可能是我的错,我无法正确使用它我已经描述它在问题中.....
  • 我在想:单击 #1:尚未创建 NodeVM,因此 TreeVM 正在发送没有接收者的消息。单击 #2:现在创建了 NodeVM,因此 TreeVM 发送并且 NodeVM 现在接收。您是否按照我的建议设置了绑定。为什么要从 TreeVM 向 NodeVM 发送消息?
猜你喜欢
  • 2011-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-25
  • 2011-06-03
  • 2011-02-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多