2013-07-31 1 views
2

이 질문은 다소 기본적인 것이지만 현재로서는 새로운 ViewModel을 MVVM Light Toolkit의 ViewModelLocator 클래스에 추가해야하는 방법을 완전히 잃어 버렸습니다.MVVM Light Toolkit의 ViewModelLocator에 새 ViewModel 추가

나의 현재 구현과 같이 보입니다 :

먼저 내가 Settings라는 이름의 창을 가지고 있다고 가정하는 뷰 모델은 SettingsViewModel과 ViewModelLocator ViewModelLocator을 지명했다.

먼저 나는 VieModelLocator 생성자에서 CreateSettings()를 호출이 항상 내가 조화를 사용하지 않는로 실행하고 응용 프로그램을 내가 그것을 실행하려고 할 때마다 구축 할 것입니다

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에서 : 창은 다음과 같이 내 MainViewModel에서 열린

<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> 

:

Settings settings = new Settings(); 
settings.Show(); 
나는 Locator 자원을 찾을 수있는 윈도우의 무능력과 관련된 오류를 읽었

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

:하지만,

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

와의 내부 예외 :이하려고하면

, 나는 예외가 나타날 대부분 블렌드와 관련이 있습니다.

현재 제가하고있는 일은 제가 잘못하고있는 것이지만 새로운 뷰 모델을 추가하는 것에 대한 문서가 너무 적어서 제가 잘못하고있는 것이 확실하지 않습니다.

편집 :

내 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 자원을 포함 할 경우에만 도움이 될 것입니다)이 방법을 바인딩을 선언하려고 :

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가 정적 인 :

<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

시도해 보았습니다. 대답하고 난 아직도 뻥이야. 같은 오류가 발생했습니다. 내 app.xaml에 로케이터 리소스가 포함되어 있습니다. 내가 편집 한 편집을 참조하십시오. – DanteTheEgregore

+0

로케이터 리소스를 MainSkin.xaml에 어떻게 통합합니까? – DanteTheEgregore

3

이이 보통 모습입니다 너의 것 같지 않아. 일반적으로 ViewModel 폴더에 있습니다 (mvvmlight를 nuget과 함께 설치 한 다음 새로운 wvvm 프로젝트를 추가했다고 가정).

그런 다음 디자인과 런타임에 대해 2 가지 경우가 진행됩니다. (사용하지 않으면 if (IsInDesignMode) ... 비트를 건너 뛰고 로직을 넣을 수 있습니다. (VS 디자이너의 가짜 데이터 미리보기가 좋기 때문에 수치 스럽지만 ...)

새로운 ViewModel을 추가하는 것은 일반적으로 그 타입의 프로퍼티를 생성하고 로케이터에 등록하여 검색 할 수있게합니다. 그러나 이것은 다르고 다르게 수행 될 수 있습니다 ...

희망 도움말 내가 도와 줄 수있는 다른 것이 있으면 알려주세요.