【问题标题】:View state remains the same when a new ViewModel instance is created MVVM创建新的 ViewModel 实例时,视图状态保持不变 MVVM
【发布时间】:2014-09-30 19:30:44
【问题描述】:

我确信这个问题的答案已经存在,只是似乎找不到。我有一个子视图,我动态地在 MainViewModel 中。然后使用样式将其显示给用户。当我创建 SubViewModel 的新实例时,如果 View 与以前的类型相同,则不会重新创建 View。这是一个问题,因为所选选项卡保持不变并且未重置为第一个选项卡。虽然我可以将选定的选项卡索引保存在 ViewModel 中以重置它,但我觉得它纯粹是 View 状态,不应该存在于 ViewModel 中。我认为这是没有注意到实例已更改的样式。每次 ViewModel 更改时,是否强制 View 创建一个新实例?

风格:

<DataTemplate DataType="{x:Type vm:SubViewModel}">
    <v:SubView />
</DataTemplate>

主视图模型:

if (DisplayItemControl != null)
{
    DisplayItemControl.Cleanup();
    DisplayItemControl = null;
}
DisplayItemControl = new SubViewModel();

【问题讨论】:

  • 强烈建议您看看 Caliburn Micro,因为它使 ViewModel 的组合变得非常容易。
  • 您似乎没有在任何地方设置数据上下文,您的其余代码在哪里?你的绑定在哪里?在 MVVM 中,您的视图模型不知道您的视图,它不应该引用控件名称。
  • DataContext 是使用视图中的内容控件和将 ViewModel 链接到视图的样式设置的。来自MainView的伴随行&lt;ContentControl Content="{Binding DisplayItemControl}"/&gt;

标签: c# wpf mvvm mvvm-light


【解决方案1】:

x:Shared="false" 添加到您的DataTemplate 资源应该允许创建一个新实例。当DisplayItemControl 直接设置为其新值时,这不起作用,而不是先将其设置为 null,所以我注意到了。

<DataTemplate DataType="{x:Type vm:SubViewModel}" x:Shared="false">
    <v:SubView />
</DataTemplate>

【讨论】:

  • 太棒了,这正是我想要的。知道这可能很容易解决。谢谢
猜你喜欢
  • 1970-01-01
  • 2020-07-17
  • 2021-01-05
  • 1970-01-01
  • 1970-01-01
  • 2020-01-01
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
相关资源
最近更新 更多