【问题标题】:In WPF, when is the constructor for a View object (MVVM pattern) called?在 WPF 中,何时调用 View 对象(MVVM 模式)的构造函数?
【发布时间】:2011-07-27 09:42:25
【问题描述】:

在以下文章中的示例应用程序中:

http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

在 CustomerView 视图中,如果您在该视图的构造函数中放置断点,则第一次命中断点。对于显示的该 UserControl 的后续实例,不会再次调用构造函数。

两个问题:

  1. 这是什么原因?
  2. 我可以在哪里放置每次创建新 CustomerView 时要执行的代码?

【问题讨论】:

    标签: wpf mvvm


    【解决方案1】:

    只创建了一个CustomerView。当您更改 CustomerViewModel 时,它不会创建新的 CustomerView,它会重用现有的。

    【讨论】:

    • 我只是想确保我理解正确。它创建一个 CustomerView。当您创建另一个选项卡时,它创建了另一个选项卡。当您在选项卡之间切换时,它使用为两个选项卡创建的相同视图,它只是每次都将绑定切换到 ViewModel?
    • 另一个问题,有人能指出我在 MSDN 上的文档或描述这种行为的东西吗?
    • @Bertus van Zyl,是的,它为所有选项卡重用相同的视图。由于一次只能看到一个选项卡,因此无需实例化多个视图。我认为文档中没有明确描述...
    【解决方案2】:

    视图只创建一次的原因是它在 TabControl/HeaderedContentControl 中。

    如果您使用列表框,您会看到每次添加新视图模型时,也会创建一个新视图。

     <ListBox ItemsSource="{Binding Path=Workspaces}">
     </ListBox>
    

    而不是

     <HeaderedContentControl 
          Content="{Binding Path=Workspaces}"
          ContentTemplate="{StaticResource WorkspacesTemplate}"
          Header="Workspaces"
          Style="{StaticResource MainHCCStyle}"
          />
    

    编辑:

    我可以在哪里放置每次创建新的 CustomerView 时要执行的代码?

    如果您使用 DataTemplates,您将永远不会自己创建新视图。您只需创建一个新的 VM/对象,然后将其显示为 DataTemplate。

    如果您想自己创建视图,则必须采用“视图优先”的方法,然后将正确的 ViewModel 添加到创建的视图中。

    【讨论】:

    • 感谢您的回复。我要解决的问题是:每个选项卡代表一个 ViewModel。现在 ViewModel 可能正在后台做事。现在,如果我需要前端向用户显示消息,ViewModel 应该让 View 通过事件或类似的东西知道何时以及显示什么。但是,如果您说三个 ViewModel,并且只有一个 View,那么只有一个 ViewModel 可以显示它的消息,具体取决于您所在的选项卡。
    • 视图应该只显示视图模型想要显示的内容。因此,如果您的视图模型有一个名为“MyMessage”的属性,并且您在视图模型的长后台线程中填充(通过调度程序!)此属性。它将显示在您的视图中。您不需要特殊事件,这完全是关于绑定和 INotifyPropertyChanged。顺便说一句,您不仅只有一种观点!你只有一个数据模板。在这个例子中你只是“看到”了一个视图,它是 tabcontrol 的行为。取一个列表框,你会看到你的 3 个视图 :)
    • 请让其他stackoverflow'ers知道你的答案是什么。
    • 答案是 TabControl 的行为方式出乎意料(如此处所述),您只需要解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多