我刚刚启动了一个WPF项目,我想使用Caliburn.Micro。
我有一个按钮
<Button Content="Button" Name="AppendData">
在我的ViewModel中我有一个方法void AppendData(){..}
它不起作用!两者之间没有约束力!但是当我这样做时
<Button Content="Button" cal:Message.Attach="AppendData()">
它突然起作用了。造成这种情况的原因是什么?
修改
我创建了一个测试应用程序,其中约定不起作用:http://ge.tt/8sNsu201?c
您可以通过使用
<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"/>
答案 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.Model
或Bind.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"
我目前无法测试所有这些内容,所以我希望没有任何错误!