2013-09-25 65 views
1

我試圖通過聲明它爲App.xaml中的資源來使用ViewModelLocator。它是一種非常簡單的類如下:找不到名爲'ViewModelLocator'異常的資源

public class ViewModelLocator 
    { 
     public ShellViewModel ShellPage 
     { 
      get 
      { 
       return new ShellViewModel(); 
      } 
     } 
} 

App.xaml文件是如下:

<Application x:Class="SomeNamespace.App" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:vm="clr-namespace:SomeNamespace.ViewModels"> 
    <Application.Resources> 
     <vm:ViewModelLocator x:Key="ViewModelLocator" /> 
    </Application.Resources> 
</Application> 

App.xaml.cs是如下:

public partial class App : Application 
    { 
     protected override void OnStartup(StartupEventArgs e) 
     { 
      base.OnStartup(e); 

      var view = new ShellView(); 
      Current.MainWindow = view; 
      Current.MainWindow.Show();    
     } 
    } 

ShellView.xaml是a如下:

<Window 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     x:Class="SomeNamespace.ShellView" 
     Title="MainWindow" 
     Height="350" 
     Width="525" 
     ResizeMode="NoResize" 
     MinWidth="700" 
     MinHeight="700" 
     DataContext="{Binding ShellPage, Source={StaticResource ViewModelLocator}}" 
     > 
    <Grid> 
     <TextBlock Text="{Binding Title}"></TextBlock> 
    </Grid> 
</Window> 

我可以看到正確的山雀在Visual Studio設計器中,但是當我運行應用程序時,得到XamlParseException: '在'System.Windows.StaticResourceExtension'上提供值拋出異常。'行號「11」和行位置「9」。

設置InnerException有{ 「無法找到名爲 'ViewModelLocator' 資源。資源名稱是區分大小寫的。」}

我這麼想嗎?

+1

+1因爲文檔是可怕的OnstartUp事件添加視圖MVVM-Light中的/ ViewModel。 – DanteTheEgregore

+0

@ZachSmith在這裏,我只是使用我自己的簡單ViewModelLocator類,沒有從MVVM燈。 – user2788792

+0

我意識到了。對於那個很抱歉。 – DanteTheEgregore

回答

2

嘗試把它的ResourceDictionary內

<Application.Resources> 
    <ResourceDictionary> 
     <vm:ViewModelLocator x:Key="ViewModelLocator" /> 
    </ResourceDictionary> 
</Application.Resources> 

編輯:

我通過使用應用程序啓動的事件,而不是覆蓋OnStartup解決了這個問題。

<Application x:Class="TestWPF.App" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:vm="clr-namespace:TestWPF.ViewModels" 
      Startup="App_Startup"> 
    <Application.Resources> 
      <vm:ViewModelLocator x:Key="ViewModelLocator" /> 
    </Application.Resources> 
</Application> 

代碼

public partial class App : Application 
{ 
    void App_Startup(object sender, StartupEventArgs e) 
    { 
     var view = new ShellView(); 
     Current.MainWindow = view; 
     Current.MainWindow.Show(); 
    } 
} 
+0

沒有爲我工作 – user2788792

+0

@ mdm20現在我沒有得到錯誤,但窗口不顯示 – user2788792

+0

嘗試刪除並重新創建app.xaml。請記住將生成操作設置爲ApplicationDefinition – mdm20

0

在啓動時你加載窗口,這是不是在我看來,一個很好的做法,因爲資源尚未完全在這兩個應用程序解決了巫婆的窗口取決於。即使你在設計時看到屬性加載,這並不總是一個好的論點,儘管設計是遵循另一個邏輯來執行代碼。
你必須讓應用程序和Windows負載,然後在窗口的網格


取下App.xaml中的資源XAML(它看起來真的出了範圍存在的),填補了上下文屬性,做這個:

<Window.Resources> 
     <wpfApplication1:ViewModelLocator x:Key="ViewModelLocator" /> 
    </Window.Resources> 

    <Grid DataContext="{Binding ShellPage, Source={StaticResource ViewModelLocator}}"> 
     <TextBlock Text="{Binding Title}"></TextBlock> 
    </Grid> 
0

看來我找到了解決方案。原因可能是App.xaml中的StartUrl。

1.去除這樣的App.xaml。這樣的默認StartUrl:

 <Application x:Class="BidingAccessories.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008" d1p1:Ignorable="d" 
        xmlns:d1p1="http://schemas.openxmlformats.org/markup-compatibility/2006"> 
      <Application.Resources> 
       <ResourceDictionary> 
        <vm:ViewModelLocator x:Key="Locator" xmlns:vm="clr-namespace:BidingAccessories.ViewModel" /> 
        <ResourceDictionary.MergedDictionaries> 
         <ResourceDictionary Source="pack://application:,,,/BidingCommon;component/CommonStyleDictionary.xaml" /> 
        </ResourceDictionary.MergedDictionaries> 
       </ResourceDictionary> 
      </Application.Resources> 
     </Application> 
     </Application.Resources> 
     </Application> 

2.覆蓋在App.xaml.cs

protected override void OnStartup(StartupEventArgs e) 
     { 
      StartupUri = new Uri("MainWindow.xaml", UriKind.Relative); 
    } 
相關問題