2012-09-19 10 views
5

私は新しいプロジェクトを開始しており、this questionで推奨されている構造上に自分のプロジェクト構造を向けています。Viewは異なるアセンブリのViewModelを見つけません

今、私は奇妙な動作を見ています。 View-XAMLでdatacontextを設定しているとき、実行時に見つからない(XamlParseExceptionを取得)。コードビハインドファイルでコンストラクタに設定すると、すべて正常に動作しています。

異なるアセンブリを使用しているときに、この公式(文書化された)の動作が行われていますか、何か間違っていますか?

コード:

が機能していない:

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(); 
} 

更新:

例外テキスト:

{ "ファイルまたはアセンブリ\ "ViewModelsRoot、PublicKeyToken = null \"またはその依存関係の1つが見つかりませんでした。システムは、指定されたファイルを見つけることができません "}

そして、私が見ることができる唯一の内側の例外がSystem.IO.FileNotFoundExceptionある

アップデート2:。。

コメントのおかげで、私の避難所名前空間を忘れてしまいましたが、コードを表示するためにここを短縮しましたが、二重と三重チェックしました(また、再度)。DataContexts名前空間もintellisenseで埋められます。<viewModels:ShellViewModel />はintelli-senseで書かれています。デザインメ... ...それ以上のアイデア?

更新3: xamlは、同じアセンブリ内のクラスにDataContextをバインドできるため、「正しく」解析されます。

+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"出力タイプを持ち、他の2つは "dll"を持っています。

私の場合、 "StartupProject"のReferencesリストに "ViewModelsRoot"を追加することで問題を解決しました。 "ViewModelsRoot.dll"は "StartupProject"出力フォルダにコピーされないため、コーディングの問題ではなく、実行時の問題です。

コードビハインドでDataContextを指定すると、Visual Studioはその "dll"の必要性を認識し、コンパイル後に出力に追加します。これは、XAMLからDataContextを設定するときには発生しません。 "ViewModelsRoot"アセンブリは、実行時に "ViewsRoot"を通して間接的に解決されるため、扱いにくいです。これをReferencesリストに追加すると、Visual Studioはどちらの場合も "dll"を強制的にコピーします。

"ViewModelsRoot.dll"を出力フォルダに直接コピーすることもできますが、コードを変更すると更新されません。

+0

これは興味深いです。私は同じ問題を抱えていましたが、この修正で解決しましたが、私にとっては、それは汚い修正です。私は私のスタートアッププロジェクトでその参照を持つことを望んでいないし、自分のプロジェクトを独立させたい。私は過去にこれが私に起こらなかったことに気がつきましたが、私はいつもViewModelへのコーディングリファレンスを持っていました。だからあまり分かりにくいハックは、あなたのViewsプロジェクトにプライベートクラスを追加して、それを呼び出すだけで、ViewModelプロジェクトのViewModelにフィールドを追加するだけです。インスタンス化する必要はありません。参照のためだけにインスタンス化する必要はありません。 –

関連する問題