2015-09-27 61 views
0

我想對同一個視圖模型使用多個視圖。我似乎無法解決這個問題。我究竟做錯了什麼? 這個簡單的例子: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

回答

0

是視圖切換... <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