caliburn.micro视图优先(WPF)的自动绑定不起作用

caliburn.micro视图优先(WPF)的自动绑定不起作用,wpf,data-binding,caliburn.micro,Wpf,Data Binding,Caliburn.micro,我对caliburn.micro中默认工作的自动绑定(约定)有问题。我将WPF与MVVM一起使用(也包括Fody.PropertyChanged、SimpleInjector、Visual Studio 2015)。我主要使用ViewModel优先的方法(例如MainView)。对于这种情况,一切正常-textbox自动绑定到VM中的属性,标签和按钮相同 但当我使用视图优先的方法添加了新的用户控件(名为“TestView”)时,问题出现了。我在构造函数中添加了InitializeComponen

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

但当我使用视图优先的方法添加了新的用户控件(名为“TestView”)时,问题出现了。我在构造函数中添加了InitializeComponent的代码,因为之前没有呈现用户控件。
我已经应用了此链接中的所有内容(“查看优先”):
(我只保留了MefBootstrapper.OnStartup未经修改的内容-在我的例子中是AppBootstrapper.OnStartup)

我有:
1.在我的虚拟机中添加了
[导出(“TestViewModel”,typeof(TestViewModel))]

2.添加到我的视图中
xmlns:cal=”http://www.caliburnproject.org"
cal:Bind.Model=“TestViewModel”

视图的DataContext设置正确。如果我手动添加绑定,那么一切都可以正常工作——但这应该由caliburn.micro自动完成(就像ViewModel一样)

我错了吗?还是必须先手动设置视图的绑定?还是我忘了什么?或者有些变化是.net和caliburn.micro已经过时了

下面是完整代码(MainView首先使用ViewModel创建,TestView首先使用View创建):

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

这是唯一的旁注/问题,请关注主要问题:)

通过提供字符串自动搜索IoC容器是自v3以来不再受支持的。该功能只被部分删除,这使得它更加混乱,文档中仍然引用了它。我创建了一个问题来解决这个问题

你可以自己打电话给国际奥委会来解决这个问题。我建议使用价值提供者,如下所示:

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}"
在您的视图中使用它,如下所示:

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调用仍然存在。

自v3以来,不再支持通过提供字符串自动搜索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}"
在您的视图中使用它,如下所示:

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
。即使在那里,国际奥委会的呼吁仍然存在。

在澄清方面:我实现这一点的方法(基本上将视图拆分为组件)是使用控件(而不是用户控件)。控件可以实现所需的功能,而不需要视图模型。在本例中,您在类中创建变量和逻辑,然后通过样式实现look。通过这种方式,可以将ViewModel链接到顶层的控件。有关实现此功能的教程,请参见以下内容:注意;不作为答案发布,因为不回答给定的问题。@DHansen据我所知,自定义控件用于覆盖控件/创建新控件。但仅适用于一个“小控件”(例如,在带有控件的库中)。用户控件可以封装一些控件的组合(例如表单)——而不是UI的一部分,而不是一个特定的小控件。在我的例子中,我将使用第二种方法(提取视图的独立部分-可以在另一个视图上使用)。但这向我展示了WPF有很多选项,thx:)在澄清方面:我实现这一点的方法(基本上将视图拆分为组件)是使用控件(而不是用户控件)。控件可以实现所需的功能,而不需要视图模型。在本例中,您在类中创建变量和逻辑,然后通过样式实现look。通过这种方式,可以将ViewModel链接到顶层的控件。有关实现此功能的教程,请参见以下内容:注意;不作为答案发布,因为不回答给定的问题。@DHansen据我所知,自定义控件用于覆盖控件/创建新控件。但仅适用于一个“小控件”(例如,在带有控件的库中)。用户控件可以封装控件的某些组合(例如表单)