通过View.Context的Caliburn.Micro多个视图不起作用

时间:2015-09-27 18:10:58

标签: wpf mvvm caliburn.micro

我想为同一个viewmodel使用多个视图。我似乎无法解决这个问题。我究竟做错了什么? 简单的例子:

文件viewmodel:

using System.IO;

namespace WpfApplicationExample.MVVM
{
    internal class FileViewModel
    {
        public FileInfo FileInfo { get; set; }
    }
}

文件列表viewmodel:

namespace WpfApplicationExample.MVVM
{
    class FileListViewModel
    {
        public FileViewModel Files { get; set; }
    }
}

文件列表视图。这是我尝试使用View.Context的地方,但不起作用

<UserControl x:Class="WpfApplicationExample.MVVM.FileListView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:cal="http://www.caliburnproject.org"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid>
        <ListView Name="Files" cal:View.Context="Details"/>
    </Grid>
</UserControl>

文件视图#1:详细信息:

<UserControl x:Class="WpfApplicationExample.MVVM.File.Details"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <StackPanel Orientation="Horizontal">
        <Label Name="FileInfo_Name"/>
        <Label Name="FileInfo_Length"/>
        <Label Name="FileInfo_Directory"/>
    </StackPanel>
</UserControl>

文件视图#2,简单:

<UserControl x:Class="WpfApplicationExample.MVVM.File.Simple"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid>
        <Label Name="FileInfo_Name"/>
    </Grid>
</UserControl>

这只是一个最基本的想法,显示文件位置以及我在哪里尝试放置 cal:View.Context =“Details”

那为什么它不起作用?

编辑:对不起,我觉得我的问题很容易理解,似乎不是。让我详细说明一下:

我所描述的情况非常简单。最简单的示例是Windows文件资源管理器。你知道,你如何轻松地改变视图:细节,列表,瓷砖,小图标,大图标等......就是这样 - 你正在显示相同文件夹的内容,相同的文件列表,因此我们假设,相同的单一视图模型。唯一改变的是用于显示相同视图模型的视图。详细信息视图,列表视图等。相同的单一视图模型。多个不同的观点。

取自Caliburn.Micro文件:

  1. View / View Model Naming Conventions · Caliburn.Micro
    部分:多视图支持的命名约定
    如文档的“约定”部分所述,该框架旨在处理ViewModel和View之间的一对多关系。

  2. Screens, Conductors and Composition · Caliburn.Micro
    部分:同一ViewModel上的多个视图
    您可能没有意识到这一点,但Caliburn.Micro可以在同一个ViewModel上显示多个视图。通过在View / ViewModel的注入站点上设置 View.Context 附加属性来支持此功能。

  3. 我希望这有助于澄清事情。

2 个答案:

答案 0 :(得分:0)

是视图切换... <ContentControl x:Name="SomePropertyName" cm:View.Context="Details" />不要相信我曾经在ListView上看过它。因为这个想法是你要切换视图。通常使用<ContentControl cm:View.Context="{Binding CurrentView}" cm:View.Model="{Binding}" />完成,其中CurrentView是您在视图模型中切换的内容,文件夹结构将在此处发挥作用。首先它将在ViewModel文件夹中的子文件夹中查看ViewModels - &gt; Main将对应MainViewModel。

你所拥有的东西将无法工作,因为视图切换的想法必须是上述情况下的数据模板。因为您正在尝试更改ListView的实际布局。在这种情况下,视图切换不会是最佳解决方案。

很多时候,使用templateselector在listview中更改了这些内容

答案 1 :(得分:0)

mmap()需要放在注入视图的View.Context上,对于ContentControl您需要修改ListView的情况。

ItemTemplate