我有一个View / ViewModel对正确使用Caliburn.Micro。
在视图中,有一个ContentControl,其内容绑定到同一个viewmodel,并且根据viewmodel中给定的枚举属性的值,我想要一个不同的ContentControl模板:
<ContentControl Content="{Binding}">
<ContentControl.Resources>
<DataTemplate x:Key="TurnedOffView">
<local:TurnedOffView/>
</DataTemplate>
<DataTemplate x:Key="DeviceReadyView">
<local:DeviceReadyView/>
</DataTemplate>
</ContentControl.Resources>
<ContentControl.Style>
<Style TargetType="ContentControl">
<Setter Property="ContentTemplate" Value="{StaticResource TurnedOffView}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding State}" Value="{x:Static local:DeviceStates.Ready}">
<Setter Property="ContentTemplate" Value="{StaticResource DeviceReadyView}"/>
</DataTrigger>
<!-- More DataTriggers here, one for each state -->
</Style.Triggers>
</Style>
</ContentControl.Style>
</ContentControl>
我知道Caliburn.Micro可以使用cal:View.Model
和cal:View.Context
,以便可以将多个视图绑定到每个ViewModel,但我无法弄清楚如何使用它来避免所有这些冗长。< / p>
所以问题是:
我应该如何在此场景中使用
View.Model
和View.Context
(并重命名我的观点)以利用Caliburn.Micro约会配置方法?
答案 0 :(得分:1)
<ContentControl cm:View.Model="{Binding}" cm:View.Context="{Binding ContextProp, Mode=TwoWay}" />
可能需要尝试...然后您的上下文将基于您的viewmodel中的代码,而不必使用视图优先代码构建datatemplate。 ContextProp基本上是你所讨论的视图的子视图(基于命名空间Project.Views.MainView.Main.TurnedOff)ContextProp =&#34; TurnedOff&#34 ;;
是的抱歉..它是我如何看到文件夹结构(命名空间)...所以不是TurnedOffView,它可以是名为Main的文件夹下的TurnedOff.xaml。这假设您的主视图是MainView.xaml,而您的主Viewmodel是MainViewModel.cs。厌倦了混乱。
View.Model可以设置为执行多个视图模型,按照该速率,您可能需要考虑框架中的Conductor。但我不认为这是有道理的,因为你基本上在上面提到的案例中进行视图切换。