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

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

问题描述:

我想对同一个视图模型使用多个视图。我似乎无法解决这个问题。我究竟做错了什么? 这个简单的例子:Caliburn.Micro通过View.Context的多个视图不起作用

的文件视图模型:

using System.IO; 

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

文件列表视图模型:

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 =“详细信息”

那么为什么它不工作?


编辑:对不起,我想我让这个问题容易理解,看起来不是。让我详细说明一下:

我描述的情况非常简单。最简单的例子是Windows文件浏览器。你知道,你如何轻松地改变视图:细节,列表,瓦片,小图标,大图标等等就是这样 - 你显示的是同一个文件夹的内容,同一个文件列表,因此我们假设,同一个单一的视图模型。唯一改变的是用于显示相同视图模型的视图。详细信息视图,列表视图等。相同的单一视图模型。多个不同的意见。

从Caliburn.Micro文件建立摘自:

  1. View/View Model Naming Conventions · Caliburn.Micro
    科:命名约定了多视角支持
    正如文件的约定部分中提到,该框架被设计用来处理ViewModel和View之间的一对多关系。

  2. Screens, Conductors and Composition · Caliburn.Micro
    科:在同一视图模型
    多个视图您可能不知道这一点,但Caliburn.Micro可以显示在同一个视图模型多个视图。这通过在View/ViewModel的注入站点上设置附加属性View.Context来支持。

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

+0

你会不会要充分分类名称“WpfApplicationExample.MVVM.File.Details”? –

+0

目前还不清楚你在这里试图用“View.Context”来做什么。 Caliburn为您处理View-ViewModel上下文映射,为什么要自己设置它? – MoonKnight

+0

用更详细的解释更新了问题。 – cryodream

是视图切换... <ContentControl x:Name="SomePropertyName" cm:View.Context="Details" />不要相信我曾经在ListView上看过它。由于这个想法是你正在切换视图。通常用<ContentControl cm:View.Context="{Binding CurrentView}" cm:View.Model="{Binding}" />完成,其中CurrentView是你在你的视图模型中切换的东西,文件夹结构将在这里发挥作用。首先它将看起来在ViewModel文件夹的子文件夹中ViewModels - > Main将对应于MainViewModel。

你有什么不会工作,因为视图切换的想法将不得不成为上述情况下的数据模板。因为你正试图改变ListView的实际布局。在这种情况下,视图切换不会是最好的解决方案。

很多时候,这些东西在列表视图改变了templateselector