View在不同的Assembly中找不到ViewModel

时间:2012-09-19 08:21:05

标签: c# wpf mvvm .net-4.0

我正在开始一个新项目,并将我的项目结构定位在this question中建议的结构上。

现在我看到了奇怪的行为。当我在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();
}

更新

例外 - 文本是:

  

{“文件或程序集\”ViewModelsRoot,PublicKeyToken = null \“或其中一个依赖项未找到。系统找不到指定的文件。”}

我能看到的唯一内部异常是System.IO.FileNotFoundException

更新2:

感谢您的评论,但我没有忘记命名空间。我在这里缩短了它以显示代码,但我加倍并且重复检查(再次)。 DataContexts命名空间也由intellisense填充。整个<viewModels:ShellViewModel />是由智能写的。所以它在设计时被发现......所以更多的想法?

更新3: xaml被“正确”解析,因为我能够将DataContext绑定到同一程序集中的类。

2 个答案:

答案 0 :(得分:3)

我使用三个项目解决方案重现了这个错误,它们之间具有指定的依赖关系:

  • StartupProject→ViewsRoot
  • ViewsRoot→ViewModelsRoot
  • ViewModelsRoot

“StartupProject”具有“exe”输出类型,而其他两个具有“dll”。

就我而言,我通过将“ViewModelsRoot”添加到“StartupProject”的References列表中来解决了这个问题。这不是编码问题,而是运行时问题,因为“ViewModelsRoot.dll”未复制到“StartupProject”输出文件夹。

在代码隐藏中指定DataContext时,Visual Studio会注意到需要“dll”并在编译后将其添加到输出中。从XAML设置DataContext时不会发生这种情况。这很棘手,因为“ViewModelsRoot”代码是从XAML和Reflection一起使用的。将其添加到“引用”列表会强制Visual Studio在两种情况下都复制“dll”。

您也可以直接将“ViewModelsRoot.dll”复制到输出文件夹,但更改代码时不会更新。

答案 1 :(得分:-1)

当项目目标框架设置为“客户端配置文件”时(我在V​​S2010,IIRC上默认设置),我经常发现此错误,如果是这种情况,请尝试将其更改为3.5或4.0。