Caliburn.Micro混淆了Button的常规绑定?

时间:2013-11-15 12:40:38

标签: caliburn.micro

我刚刚启动了一个WPF项目,我想使用Caliburn.Micro。

我有一个按钮

<Button Content="Button" Name="AppendData">

在我的ViewModel中我有一个方法void AppendData(){..}

它不起作用!两者之间没有约束力!但是当我这样做时

<Button Content="Button" cal:Message.Attach="AppendData()">
它突然起作用了。造成这种情况的原因是什么?

修改
我创建了一个测试应用程序,其中约定不起作用:http://ge.tt/8sNsu201?c 您可以通过使用

替换MyView中的控件来使其工作
<Button cal:Message.Attach="SetText()"  Content="Button" HorizontalAlignment="Left" Margin="106,153,0,0" VerticalAlignment="Top" Width="75"/>
<Label Content="{Binding Text}" HorizontalAlignment="Left" Margin="124,104,0,0" VerticalAlignment="Top"/>

2 个答案:

答案 0 :(得分:2)

在看了你的源代码之后,我注意到一个重大错误导致所有这些混乱:

public MyView()
{
    InitializeComponent();
    DataContext = new MyViewModel(); // SOURCE OF TROUBLE
    // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
}

在Caliburn.Micro中,你不要手动为你的视图设置DataContext,而是让Caliburn.Micro使用它的约定为你的视图模型找到合适的视图,然后它将绑定两个一起(通过将视图模型设置为视图的DataContext,之后它将应用许多约定来使一切正常工作。

解释为什么使用cal:MessageAttach()会起作用并直接使用AppendData将无法解释,因为您似乎不了解CM的基础知识。

所以我建议你先看一下documentation wiki并至少阅读前5篇文章,然后这里有一个提示,可以帮助你发现为什么第一种方法有效,第二种方法没有:

  

消息冒泡

答案 1 :(得分:1)

因为这会扩大评论的最大长度,所以我把它写成答案。

正如你在答案中提到的,做DataContext = new MyViewModel()是CM中的一种代码味道。如果您想在视图中手动连接,这将是正确的方法(首先查看)。查看有关此文档的CM文档,因为我认为可能会遗漏一些内容:

var viewModel = new MyViewModel();
var view = this;
ViewModelBinder.Bind(viewModel, view, null);

您也可以在视图的XAML中完成此操作。将以下内容添加到视图的UserControl标记中(首先查看):

xmlns:cal="http://www.caliburnproject.org"
cal:Bind.Model="MyViewModel"

首先查看模型将完全相同,以防您不愿意使用您在答案中描述的默认行为:

xmlns:cal="http://www.caliburnproject.org"
cal:View.Model="MyViewModel"

我不确定,但是如果你想使用View.ModelBind.Model,我认为你必须在你的视图模型中添加一个明确命名的导出合约,但它可能会在没有好。试试吧:

[Export("MyViewModel", typeof(MyViewModel))]  
public class MyViewModel : Screen  
{  
    // ...
}

设计时间视图先查看首先查看模型无关! 设计时视图支持完成如下:

xmlns:cal="http://www.caliburnproject.org"
d:DataContext="{d:DesignInstance viewModels:MyViewModel, IsDesignTimeCreatable=True}"
cal:Bind.AtDesignTime="True"

我目前无法测试所有这些内容,所以我希望没有任何错误!