切换视图中的部分xaml(Caliburn.Micro)

时间:2013-12-12 02:13:06

标签: c# wpf xaml datatemplate caliburn.micro

我只想切换我的View(UserControl)xaml的某些部分。 例如,我希望能够仅更改第2个网格。

<Grid> //main grid
    <Grid Name="1" Grid.Row="1"/>
    <Grid Name="2" Grid.Row="2"/>
</Grid

我试过这样的事:

<UserControl.Resources>
    <ControlTemplate x:Key="UsualMode">
        <Grid>
        ...
        </Grid>
    </ControlTemplate>
</UserControl.Resources>
<Grid> //main grid
    <Grid Name="1" Grid.Row="1"/>
    <ControlTemplate Name="2" Grid.Row="2" Template="{StaticResource UsualMode}"/>
</Grid>

然后,通过使用触发器和绑定,我将能够切换模板。 不幸的是,由于“未找到Bootstrapper.cs”异常,这对我不起作用。 我该怎么办?我不能使用指挥 - &gt;必须只加载一个视图。

1 个答案:

答案 0 :(得分:1)

http://caliburnmicro.codeplex.com/wikipage?title=All%20About%20Conventions

阅读有关视图分辨率的基础知识

基本上,您会在视图中创建以下内容:

<UserControl.Resources>
    <ControlTemplate x:Key="UsualMode">
        <Grid>
        ...
        </Grid>
    </ControlTemplate>
</UserControl.Resources>
<Grid> //main grid
    <Grid Name="1" Grid.Row="1"/>
    <ContentControl x:Name="ChildViewModel" cal:View.Context="{Binding ContextBinding}" />
</Grid>

您的父视图模型需要具有“上下文”属性和容纳子VM的属性:

public class ParentViewModel
{
    public SomeViewModel ChildViewModel { get; private set; }

    public string ContextBinding { get; private set; } // make sure you implement INPC on these properties as is the usual
}

然后,您的视图将根据ContextBinding字符串进行解析(根据上述CM惯例)。

所以如果你要更新字符串:

ContextBinding = "DetailedView";

CM然后会更新UI并尝试在当前VM名称空间的子名称空间中查找名为DetailedView的视图

如果您不想拥有子VM,您实际上可以提前启动CM约定并在当前VM上应用上下文,但在这种情况下,您需要创建两个几乎完全相同的视图来自您想要“换出”的区域。

我的偏好是创建一个子VM来处理将交换视图的子区域,如上所示