gpt4 book ai didi

c# - 未显示单例 ViewModel 的 View

转载 作者:行者123 更新时间:2023-11-30 21:42:14 25 4
gpt4 key购买 nike

我有一个使用 Caliburn.Micro 2.0.1 的 wpf 应用程序,我发现 Caliburn.Micro 有奇怪的行为。在最新的 3.0.3 中它也存在。

重现错误的 super 简单项目:https://github.com/ihtfw/CaliburnMicroBug

MainWindowViewModel 是屏幕的导体。有两个 ScreenViewModel 作为具有 SingletonViewModel 属性的 MainWindowViewModel 的项目。在 MainViewModel 中,我可以切换到第一个 ScreenViewModel 或第二个。

除了 SingletonViewModel 的 View 在切换到第二个屏幕后仅显示在第二个 ScreenViewModel 上之外,一切都完美无缺。

重现:

  • 启动应用
  • 切换到第二屏幕
  • 切换回第一屏
  • 未显示 SingletonViewModel 的 View =(

如何解决这个问题?

更新

用 ContentControl 做这些是不可能的。应该使用显式 View 。在这种情况下,SingletonView 并设置它的 DataContext。要连接 Caliburn.Micro Action ,请在没有上下文的情况下绑定(bind)它们。所以结果将是:

<local:SingletonView DataContext={Binding Path=SingletonViewModel} cal:Action.TargetWithoutContext="{Binding}" />

最佳答案

如其他答案中所述,您不能拥有“单一 View ”,xaml UI 模型不允许相同的 UI 元素出现在可视化树中两次。

然而,您可以做的是将同一 View 的两个实例绑定(bind)到 View 模型。

为此,您需要避开框架的一项功能。

在内部任何实现 IViewAware 的 View 模型都持有对 View 的弱引用,任何时候框架试图为 View 模型定位 View 时,它首先查询 View 模型以获取该引用。

如果返回引用,则 View 将从其现有位置移除并插入到新位置。

为了阻止这种情况,您可以做以下三件事之一:

  1. 不要让您的 SingletonViewModel 继承自实现 IViewAware 的东西,例如 PropertyChangedBase
  2. 做一些非常 hacky 的事情,并使用下面的第一个代码示例取消附加 View 。
  3. 使用下面的第二个代码示例更改 ViewLocator.LocateForModel 以删除此行为。

Hacky 归零 View

protected override void OnViewAttached(object view, object context)
{
Views[context ?? ViewAware.DefaultContext] = null;
}

移除 IViewAware 行为

ViewLocator.LocatorForModel = (model, location, context) => ViewLocator.LocateForModelType(model.GetType(), location, context);

关于c# - 未显示单例 ViewModel 的 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42717329/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com