【问题标题】:How to declare/attach a ViewModel for a UserControl in MVVM Light如何在 MVVM Light 中为 UserControl 声明/附加 ViewModel
【发布时间】:2016-12-22 11:50:30
【问题描述】:

我正在使用 MVVM Light 库开发一个应用程序(c#、wpf)。 我有一个带有 ViewModel 的主窗口,附加为DataContext="{Binding Main, Source={StaticResource Locator}}"。没关系。 但在主窗口中我有不同的用户控件。目前使用哪一个由如下切换器定义:

    <DataTemplate DataType="{x:Type model:Type1}">
      <controls:UC1 Content="{Binding}"/>
    </DataTemplate>

问题是如何为 UserControl 声明 ViewModel 并将其链接到 UC DataContext。如果这将支持设计时演示数据,那就太好了。

【问题讨论】:

  • 为什么要“为 UserControl 声明 ViewModel 并将其链接到 UC DataContext”?当您正确使用 DataTemplates 和 ContentControls 时,这会自动完成。这表明要么 1) 你不是,要么 2) 你正在创建视图模型,专门用于控制你的用户控件的行为。我无法从您的问题中判断 #1 是否为真,如果 #2 为真,请停止。 TextBox 有 TextBoxViewModel 吗?不,MVVM != 没有代码隐藏。 UI 逻辑在你的代码隐藏中。
  • @ 是的,我现在链接我的 UC DataContext。你说得对,我的主要目标是控制 UC 行为(#2)。我为什么要做是因为那个UC比较复杂(其实每个控件都是一个小程序,但是我想在主窗口下集成几个)。
  • 创建控制 UserControls 行为的 ViewModel 可能会给您带来麻烦。最常见的方式是干扰 DataContext 的流动。您可能会发现自己试图将类似伪 DataContext 的属性绑定到您的视图模型,或者在处理 DataContext 中的内容时遇到问题。解决方案是不要这样做。将您的 UI 逻辑放在代码隐藏中。

标签: c# wpf mvvm mvvm-light


【解决方案1】:

试试这个

<DataTemplate DataType="{x:Type model:Type1}">
  <controls:UC/>
</DataTemplate>

还要加上

<ContentPresenter Content="{Binding ViewModelObj}">
</ContentPresenter>

【讨论】:

  • "问题是如何为 UserControl 声明 ViewModel 并将其链接到 UC"
  • @A.S.Mahadik :如果您有更多信息来澄清您的答案,您应该编辑您的答案以包含新信息;这样,任何读者都可以理解您的整个答案,而无需阅读评论历史记录。
猜你喜欢
  • 2016-12-10
  • 2013-05-31
  • 2013-11-10
  • 1970-01-01
  • 1970-01-01
  • 2014-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多