2013-07-31 108 views
2

我知道這個問題有點基本,但在目前,我完全失去了如何添加一個新的ViewModel到我的ViewModelLocator類在MVVM輕工具包。在MVVM Light工具包中添加一個新的ViewModel到ViewModelLocator

我目前的實現看起來像這樣:

首先,假設我有一個名爲Settings窗口,一個視圖模型命名SettingsViewModel和ViewModelLocator ViewModelLocator

首先我打電話CreateSettings()在VieModelLocator構造:

public ViewModelLocator() 
{ 
    if (ViewModelBase.IsInDesignModeStatic) 
    { 

    } 
    else 
    { 
     CreateSettings(); 
    } 

    CreateMain(); 
} 

注意,因爲我沒有使用混合這將始終運行,每一次我嘗試運行它構建應用程序。現在是`CreateSettings()方法。

我不知道我在做什麼,所以我試圖安全地玩它,並在創建和管理MainViewModel的方法之後對所有東西進行建模。

public static void CreateSettings() 
{ 
    if (_settings == null) 
    { 
     _settings = new SettingsViewModel(); 
    } 
} 

再經過那些用於MainViewModel建模再過方法:

[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", 
    "CA1822:MarkMembersAsStatic", 
    Justification = "This non-static member is needed for data binding purposes.")] 
public SettingsViewModel Settings 
{ 
    get 
    { 
     return SettingsStatic; 
    } 
} 

public static SettingsViewModel SettingsStatic 
{ 
    get 
    { 
     if (_settings == null) 
     { 
      CreateSettings(); 
     } 

     return _settings; 
    } 
} 

在我Settings窗口的XAML:

<Window x:Class="_5500A_Auto_Calibrator.Settings" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Settings" Height="300" Width="300" 
    DataContext="{Binding Source={StaticResource Locator}, Path=Settings}"> 
<Window.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="Skins/MainSkin.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Window.Resources> 

窗口,然後從我的MainViewModel打開,像這樣:

Settings settings = new Settings(); 
settings.Show(); 

如果我試試這個,我收到一個異常:

"'Provide value on 'System.Windows.StaticResourceExtension' threw an exception.' Line number '4' and line position '39'." 

和內部異常:

"Cannot find resource named 'Locator'. Resource names are case sensitive." 

我已經在涉及窗口的無能找Locator資源的錯誤讀了,但是大部分都與混合有關。

我目前的看法是,我做錯了什麼,但是有很少的文檔來添加新的ViewModel,我不確定我做錯了什麼。

編輯:

我的App.xaml:

<Application x:Class="_5500A_Auto_Calibrator.App" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:vm="clr-namespace:_5500A_Auto_Calibrator.ViewModel" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      StartupUri="MainWindow.xaml" 
      mc:Ignorable="d"> 

    <Application.Resources> 
     <!--Global View Model Locator--> 
     <vm:ViewModelLocator x:Key="Locator" 
          d:IsDataSource="True" /> 
    </Application.Resources> 

</Application> 
+0

嘿丹特,這是否回答你的問題?(如果是的話,你可以標記爲答案,如果沒有,你可以詳細說明一些:) – Noctis

回答

0

你的數據上下文綁定嘗試先申請,比資源聲明。試圖聲明結合這種方式(當然,這應該有助於僅在某個MainSkin.xaml或應用程序資源包含Locator資源):

<Window.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="Skins/MainSkin.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Window.Resources> 
<Window.DataContext> 
    <Binding Source="{StaticResource Locator}" Path="Settings"/> 
</Window.DataContext> 
+0

試過了答案,我仍然gett同樣的錯誤。我的app.xaml包含一個定位器資源。請參閱我製作的頂部的修改。 – DanteTheEgregore

+0

我如何將Locator資源整合到MainSkin.xaml中? – DanteTheEgregore

3

這是怎麼回事通常看起來:

public class ViewModelLocator 
{ 
    static ViewModelLocator() 
    { 
     ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default); 

     if (ViewModelBase.IsInDesignModeStatic) 
     { 
      SimpleIoc.Default.Register<IDataService, Design.DesignDataService>(); 
     } 
     else 
     { 
      SimpleIoc.Default.Register<IDataService, DataService>();  
     } 

     SimpleIoc.Default.Register<MainViewModel>(); 
    } 

    /// <summary> 
    /// Gets the Main property. 
    /// </summary> 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", 
     "CA1822:MarkMembersAsStatic", 
     Justification = "This non-static member is needed for data binding purposes.")] 
    public MainViewModel Main 
    { 
     get 
     { 
      return ServiceLocator.Current.GetInstance<MainViewModel>(); 
     } 
    } 

    ... 
} 

的ViewModelLocator是靜態的,你的似乎不是。它通常位於ViewModel文件夾中(假設您使用nuget安裝了mvvmlight,然後添加了一個新的wvvm項目。

然後它進行設計和運行時的兩種情況。 (如果你不使用它,你可以跳過if (IsInDesignMode) ...位,然後放一下你的邏輯(雖然很遺憾,因爲在VS設計器中預覽一些假數據是很好的...)

添加新的ViewModel通常涉及創建該類型的屬性,並將它們註冊到定位器,以便您可以檢索它們...但是這有所不同,可以以不同的方式完成,我相信...

希望得到這個幫助,如果還有什麼我可以幫忙的,請讓我知道

相關問題