有没有办法在Caliburn.Micro中使用它重用WPF View?
在示例中,我有一个带有SaveAndClose和Cancel按钮的DetailViewBase.xaml。现在我想在PersonView(Model)中使用DetailViewModelBase和XAML。
我希望这个问题很明确。
答案 0 :(得分:2)
如果我的假设是正确的,我认为你的意思是你想要从几个更简单的视图模型中“组合”一个更复杂的视图。您可以从视图模型继承,但显然视图模型一次只能有一个活动视图。
但是,使用绑定可以组合多个视图模型并让它们一起渲染各自的视图以构成更复杂的UI
e.g。
具有保存/取消按钮的VM
public class ActionsViewModel
{
public void Save()
{
}
public void Cancel()
{
}
}
相应的观点:
<UserControl>
<StackPanel Orientation="Horizontal">
<Button x:Name="Save">Save</Button>
<Button x:Name="Cancel">Cancel</Button>
</StackPanel>
</UserControl>
另一个组成自己的视图和ActionsViewModel
public class ComposedViewModel
{
public ActionsViewModel ActionsView
{
get; set;
}
public ComposedViewModel()
{
ActionsView = new ActionsViewModel();
}
public void DoSomething()
{
}
}
观点:
<UserControl>
<StackPanel Orientation="Horizontal">
<TextBlock>Hello World</TextBlock>
<Button x:Name="DoSomething">Do Something</Button>
<ContentControl x:Name="ActionsView" />
</StackPanel>
</UserControl>
使用约定绑定(或使用附加属性)绑定ContentControl
时,CM会自动将VM绑定到DataContext
并连接视图。这样,您就可以将多个VM组合成一个更复杂的功能。
此外,由于操作消息冒泡 - 如果您要删除ActionsViewModel
上的“确定”和“取消”实施并将其放入ComposedViewModel
实施中,则操作消息将会冒泡直到ComposedViewModel
实例并在那里激活方法
e.g。
public class ActionsViewModel
{
// Remove the command handlers
}
public class ComposedViewModel
{
public ActionsViewModel ActionsView
{
get; set;
}
public ComposedViewModel()
{
ActionsView = new ActionsViewModel();
}
public void DoSomething()
{
}
// CM will bubble the messages up so that these methods handle them when the user clicks on the buttons in the ActionsView
public void Save()
{
}
public void Cancel()
{
}
}
编辑:
抱歉,我忘记了这一点 - 基于约定的绑定不允许消息冒泡,但您可以使用Message.Attach
附加属性来实现此目的:
// Make sure you include the caliburn namespace:
<UserControl xmlns:cal="http://www.caliburnproject.org">
<StackPanel Orientation="Horizontal">
<Button x:Name="Save" cal:Message.Attach="Save">Save</Button>
<Button x:Name="Cancel" cal:Message.Attach="Cancel">Cancel</Button>
</StackPanel>
</UserControl>
答案 1 :(得分:0)
您可以使用以下代码显式地将ViewModel绑定到View:
cal:Bind.Model={Binding DetailViewModelBase}