【问题标题】:Automatic binding does not work for caliburn.micro in View First (WPF)View First (WPF) 中的 caliburn.micro 自动绑定不起作用
【发布时间】:2023-03-12 02:14:01
【问题描述】:

我有一个自动绑定(约定)的问题,它应该在 caliburn.micro 中默认工作。我将 WPF 与 MVVM 一起使用(还有 Fody.PropertyChanged、SimpleInjector、Visual Studio 2015)。我主要使用 ViewModel-first 方法(例如 MainView)。对于这种情况,一切正常 - 文本框自动绑定到 VM 中的属性,标签和按钮相同。

但是当我使用视图优先的方法添加新的用户控件(名为“TestView”)时出现了问题。我在构造函数中添加了带有 InitializeComponent 的代码隐藏,因为之前未呈现用户控件。
我已应用此链接中的所有内容(“查看优先”):https://caliburnmicro.codeplex.com/wikipage?title=All%20About%20Actions
(我只留下了未修改的 MefBootstrapper.OnStartup - 在我的例子中是 AppBootstrapper.OnStartup)

我已经:
1. 将[Export("TestViewModel", typeof(TestViewModel))] 添加到我的虚拟机
2. 添加到我的视图
xmlns:cal="http://www.caliburnproject.org" cal:Bind.Model="TestViewModel"

View 的DataContext 设置正确。如果我手动添加绑定,那么一切正常 - 但这应该由 caliburn.micro 自动完成(例如 ViewModel-first)。

我错了吗?还是我必须手动设置 View-first 的绑定?还是我忘记了什么?或者也许一些变化是 .net 和 caliburn.micro 已经过时了......

以下完整代码(MainView 使用 ViewModel-first,TestView 使用 View-first):
https://github.com/Krzyrok/caliburn.micro-problem

PS(旁注/问题/澄清)
我知道更流行的是 ViewModel-first 方法,我可以将我的 UserControl 更改为此(并且自动绑定将再次起作用)。问题与此无关,但以下是我的动机(也许 WPF 中建议了另一种方法):
我选择这个解决方案是因为我想要“封闭”组件(类似于使用 React 在前端拆分组件)——我想使用一个“完整”组件/UserControl,我可以在 MainView 上使用它,而无需在 MainVM 中声明任何额外的 VM。在我的情况下,TestView 确切地知道应该使用什么 VM,因此没有理由强迫我/另一个程序员也声明 VM - 它只需要他将来会使用的 View(VM 是逻辑的“技术细节/实现”) .但是:是否有另一种方法可以将视图拆分为 WPF 中较小的“组件”/部分(建议使用)?我进行了搜索,UserControl 似乎符合假设。
编辑:“组件/部分”是指视图的某些部分([组成] 几个负责例如显示/编辑用户详细信息的控件)。
这只是旁注/问题,所以请关注主要问题:)

【问题讨论】:

  • 在澄清方面:我实现这一点的方式(本质上将视图拆分为组件)是使用控件(而不是用户控件)。控件可以在不需要视图模型的情况下实现您想要的。在这种情况下,您在一个类中创建变量和逻辑,然后通过样式实现外观。通过这种方式,您可以将 ViewModel 链接到顶层控件。请查看以下教程以实现此操作:wpftutorial.net/HowToCreateACustomControl.html 注意;不作为答案发布,因为不回答给定的问题。
  • @DHansen 据我了解,自定义控件用于覆盖控件/创建新控件。但仅适用于一个“小控件”(例如,在带有控件的库中)。并且用户控件可以封装一些控件组合(例如表单)——而不是 UI 的一部分,而不是特定的一个小控件。 wpftutorial.net/CustomVsUserControl.html 在我的情况下我会第二个(提取独立的视图部分 - 可以在另一个视图上使用)。但这向我表明 WPF 有很多选择,谢谢 :)

标签: wpf data-binding caliburn.micro


【解决方案1】:

不再支持通过提供字符串自动搜索 IoC 容器,从 v3.3 开始。该功能仅被部分删除,使其更加混乱,并且仍然在文档中引用。我创建了一个问题来解决这个问题。

您可以通过自己调用 IoC 来解决此问题。我建议使用价值提供者,如下所示:

public class IoCExtension : MarkupExtension
{
    private readonly string key;

    public IoCExtension(string key)
    {
        this.key = key;
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return IoC.GetInstance(null, this.key);
    }
}

并像这样在您的视图中使用它:

xmlns:t="clr-namespace:TestingCaliburnMicro"
cal:Bind.Model="{t:IoC TestViewModel}"

这样,如果静态 IoC 类有一天消失了,您可以轻松地用自己的解决逻辑替换。

提交和问题:

Bind 类中还有另一个附加属性,名为 Bind.ModelWithoutContext。即使在那里,IoC 调用仍然存在。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 1970-01-01
    • 1970-01-01
    • 2018-12-07
    • 1970-01-01
    相关资源
    最近更新 更多