简体   繁体   中英

Switching part of xaml in View (Caliburn.Micro)

I'd like to switch only some part of my View (which is UserControl) xaml. For example, I'd like to be able to change only 2nd Grid.

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

I've tried sth like this:

<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>

Then, by using triggers and binding I would be able to switch templates. Unfortunately, this doesn't work for me due to 'Bootstrapper.cs not found' exception. How should I do that? I cannot use conductor -> have to load only one View.

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

Read up on the basics of view resolution

Basically you would create the following in your view:

<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>

Your parent viewmodel needs to have a 'context' property and a property to house the child 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
}

Your view will then be resolved based on the ContextBinding string (as per the CM conventions above).

So if you were to update the string:

ContextBinding = "DetailedView";

CM would then update the UI and try to look for a view called DetailedView in a subnamespace of the current VMs namespace

If you don't want to have a child VM, you can actually get CMs conventions to kick in earlier and apply a context over the current VM, but in this case you would need to create two views which were almost identical apart from the area which you would like to 'swap out'.

My preference would be to create a child VM to handle the sub-area that will swap views as I've shown above

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM