2012-09-19 68 views
5

我正在啓動一個新項目並將其項目結構定向在this question中推薦的結構上。查看未在其他裝配中找到ViewModel

現在我看到了奇怪的行爲。當我在View-XAML中設置datacontext時,在運行時找不到(獲取XamlParseException)。當我將它設置在codebehind-file的構造函數中時,一切正常。

使用不同的程序集時,這是官方(記錄)的行爲,還是我做錯了什麼?

代碼:

不工作:

MainView.xaml:

<UserControl x:Class="ViewsRoot.Views.MainView"    
     xmlns:baseControls="clr-namespace:BaseControls;assembly=BaseControls"    
     xmlns:viewModels="clr-namespace:ViewModelsRoot;assembly=ViewModelsRoot"> 
<UserControl.DataContext> 
    <viewModels:ShellViewModel /> 
</UserControl.DataContext> 

MainView.xaml.cs

public MainView() 
{ 
    InitializeComponent(); 
    // No DataContext set in codebehind-file  
} 

工作:

MainView.xaml:

<UserControl x:Class="ViewsRoot.Views.MainView"    
     xmlns:baseControls="clr-namespace:BaseControls;assembly=BaseControls"    
     xmlns:viewModels="clr-namespace:ViewModelsRoot;assembly=ViewModelsRoot"> 
<!--<UserControl.DataContext> 
    <viewModels:ShellViewModel /> 
</UserControl.DataContext> --> 

MainView.xaml.cs:

public MainView() 
{ 
    InitializeComponent(); 
    DataContext = new ViewModelsRoot.ShellViewModel(); 
} 

更新:

異常-Text是:

{「的文件或程序集\「ViewModelsRoot,PublicKeyToken = null \」或其某個依賴項未找到。該系統找不到指定的文件「}

而唯一的內部異常,我可以看到的是一個System.IO.FileNotFoundException

更新2:

感謝您的意見,但我避風港忘了命名空間,爲了顯示代碼,我在這裏縮短了它,但是我再次進行了雙重和三重檢查,DataContexts命名空間也被intellisense填充,整個<viewModels:ShellViewModel />是由智能編寫的,所以它在設計時間... ...所以更多的想法?

更新3: 由於我能夠將DataContext綁定到同一個程序集中的類,所以xaml得到了「正確」解析。

+0

有沒有內部異常? – Guillaume

+0

@Guillaume請參閱我更新的問題:) – basti

+0

您可能忘記了'UserControl'中的一些命名空間。檢查是否有幫助:http://stackoverflow.com/questions/8852912/xamlparseexception-in-view – Guillaume

回答

-1

當項目目標框架設置爲「客戶端配置文件」(VS2010,IIRC默認設置)時,我經常發現這個錯誤,如果是這種情況,請嘗試將其更改爲3.5或4.0。

+0

對不起。沒有運氣 - 這是.net4 - 完整的個人資料。 – basti

+0

任何機會,你可以上傳你的項目,讓我可以看看? –

2

我已複製使用樹項目的解決了這個錯誤,與它們之間的指定的依賴:

  • StartupProject→ViewsRoot
  • ViewsRoot→ViewModelsRoot
  • ViewModelsRoot

「StartupProject」具有「exe」輸出類型,而另外兩個具有「dll」。

在我的情況下,我通過在「StartupProject」的參考列表中添加「ViewModelsRoot」來解決問題。這不是一個編碼問題,而是一個運行時問題,因爲「ViewModelsRoot.dll」未被複制到「StartupProject」輸出文件夾中。

當您在代碼隱藏中指定DataContext時,Visual Studio會注意到需要該「dll」並在編譯後將其添加到輸出中。從XAML設置DataContext時不會發生這種情況。這很棘手,因爲「ViewModelsRoot」程序集在運行時通過「ViewsRoot」間接解析。將它添加到引用列表迫使Visual Studio在這兩種情況下複製「dll」。

您也可以直接將「ViewModelsRoot.dll」複製到輸出文件夾,但在更改代碼時不會更新。

+0

這很有趣。我遇到了同樣的問題,並通過此修復程序解決了這個問題,但對我來說這是一個骯髒的修復程序我不想在我的啓動項目中引用該參考,並且我確實希望我的項目獨立。我注意到這在過去從未發生過,但在過去,我總是對ViewModel有一些編碼參考。所以...一個不太明顯的黑客攻擊就是在您的Views項目中添加一個私有類,然後根據需要調用它,只需將一個字段添加到ViewModel項目中的ViewModel。它甚至不需要實例化,僅供參考。 –