【问题标题】:Caliburn.Micro multiple views via View.Context doesn't work通过 View.Context 的 Caliburn.Micro 多个视图不起作用
【发布时间】:2015-09-27 18:10:58
【问题描述】:

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

文件视图模型:

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="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。这可以通过在 View/ViewModel 的注入站点上设置 View.Context 附加属性来支持。

我希望这有助于解决问题。

【问题讨论】:

  • 您不需要完全分类名称“WpfApplicationExample.MVVM.File.Details”吗?
  • 目前尚不清楚您在此处尝试使用“View.Context”做什么。 Caliburn 会为您处理 View-ViewModel 上下文映射,您为什么要自己设置?
  • 用更详细的解释更新了问题。

标签: wpf mvvm caliburn.micro


【解决方案1】:

View.Context 需要放置在注入视图的ContentControl 上,对于ListView,您需要修改ItemTemplate

<ListView.ItemTemplate>
    <DataTemplate>
        <ContentControl cm:View.Model="{Binding}" cm:View.Context="Details" />
    </DataTemplate>
</ListView.ItemTemplate>

【讨论】:

  • 我能得到有关 cm:View.Model="{Binding}" cm:View.Context="Details" 的知识吗?厘米是多少?这在 xaml 文件中没有解决。我用 xmlns:cal="caliburnproject.org" ... cm 是 cal?所以我应该使用 xmlns:cm"caliburnproject.org"?你是这个意思吗?
  • cm 和 cal 是 xaml 命名空间前缀,可以是任何你想要的。两者都可以,只需要确保您在代码中使用的那个与文件头中的那个相同。
【解决方案2】:

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

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

很多时候这些东西在列表视图中使用模板选择器进行了更改

【讨论】:

    猜你喜欢
    • 2016-03-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-14
    • 2011-12-14
    • 1970-01-01
    • 1970-01-01
    • 2016-05-08
    • 2015-06-04
    相关资源
    最近更新 更多