2013-07-09 114 views
0

我一定誤解了ViewModels和Views的概念。但是現在我無法從地面重建應用程序,這一次做得更好。我的情況是,我有一個視圖,用戶可以加載文件並讀取它們,繪圖儀顯示圖形並執行一些操作。我希望能夠生成數據的報告(如摘要),但我想在其他視圖中使用它。我正在使用ModernUI,此另一視圖位於另一個選項卡中。兩個視圖 - 一個ViewModel

我想要的是兩個選項卡同步,當我在「繪圖儀選項卡」中加載文件時,該文件也必須加載到另一個視圖中。爲此,我認爲我需要的是將視圖綁定到相同的ViewModel,其中我有例如LoadedFiles = List<File>,所以我將能夠實現它。問題是,如果我綁定,要麼

MainViewModel vm = new MainViewModel(); 
DataContext = vm; 

或XAML

<UserControl.Resources> 
<UserControl.DataContext=local:MainViewModel/> 
</UserControl.Resources> 

我實際上綁定到不同的MainViewModels和數據不再被共享。我是否需要一些來自MVVM庫(例如Locator等)的類?如何做到這一點?我可以在將來做什麼,以便爲每個視圖分別使用不同的ViewModels,但數據是相同的(或不同的)?

回答

1

您可以創建一個新的有你的LoadedFiles屬性的類,然後每個唯一的視圖模型可以引用這個類。您可以與多個視圖模型之間的這些共享屬性共享一個類。我using MVVMLight's Locator with an Autofac container注入這個類到我的每個視圖模型(基本上使用控制和依賴注入反轉)。

您可以閱讀控制反轉和依賴注入here

一些示例代碼 -

public MyClass 
{ 
    public List<File> LoadedFiles{get; set;} 
} 

public ViewModelOne 
{ 
    public MyClass MyClassInstance {get; set;} 
    public ViewModelOne(MyClass myclass) 
    { 
     MyClassInstance = myclass 
    } 
} 

public ViewModelTwo 
{ 
    public MyClass MyClassInstance {get; set;} 
    public ViewModelTwo(MyClass myclass) 
    { 
     MyClassInstance = myclass 
    } 
} 

你也可以使用MVVMLight's Locator每個視圖的DataContext的設置爲相應的視圖。

<UserControl x:Class="View1"    
      DataContext="{Binding ViewModel1, Source={StaticResource Locator}}"...> 
0

將VM存儲在父虛擬機的屬性中,然後使用不同的ContentTemplates(包含相應的視圖)將該屬性綁定到兩個ContentPresenters

0

你應該問自己,你的兩個視圖是否應該共享相同的視圖模型? 它們在視圖模型中共享相同的屬性還是它們具有不同的屬性? 如果他們應該共享相同的視圖模型,您應該使用定位器從定位器中創建視圖模型並將定位器傳遞給視圖。 否則,您應該有兩個視圖模型。爲了在視圖模型之間保持最小的壓力,你應該使用兩個視圖模型都已知的服務(通過接口更好)。一個視圖模型通知有關行動已執行的服務,第二個視圖模型已經處理這個動作(通過寄存器事件)

好運,

M.卡察夫