如何使用Caliburn.Micro而不是这些DataTriggers应用约定配置?

时间:2014-11-03 17:53:24

标签: wpf mvvm caliburn.micro datatrigger

我有一个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.Modelcal:View.Context,以便可以将多个视图绑定到每个ViewModel,但我无法弄清楚如何使用它来避免所有这些冗长。< / p>

所以问题是:

  

我应该如何在此场景中使用View.ModelView.Context(并重命名我的观点)以利用Caliburn.Micro约会配置方法?

1 个答案:

答案 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。但我不认为这是有道理的,因为你基本上在上面提到的案例中进行视图切换。