【问题标题】:View doesn't find ViewModel in different AssemblyView 在不同的程序集中找不到 ViewModel
【发布时间】:2012-09-19 08:21:05
【问题描述】:

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

现在我看到了奇怪的行为。当我在 View-XAML 中设置数据上下文时,在运行时找不到它(获取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 \"或其依赖项之一未找到。系统找不到指定的文件。"}

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

更新 2:

感谢 cmets,但我没有忘记命名空间。我在这里缩短了它以显示代码,但我(再次)进行了双重和三重检查。 DataContexts 命名空间也由智能感知填充。整个&lt;viewModels:ShellViewModel /&gt; 由intelli-sense 编写。所以它是在设计时发现的......所以还有什么想法吗?

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

【问题讨论】:

  • 内部有异常吗?
  • @Guillaume 请查看我更新的问题:)
  • 您可能忘记了UserControl 中的一些命名空间。检查这是否有帮助:stackoverflow.com/questions/8852912/xamlparseexception-in-view
  • @Guillaume 谢谢,我再次更新了我的问题。 :)
  • 嗯,我知道我过去遇到过这个异常。检查您的视图模型程序集中使用的所有引用是否也在您的视图之一中引用。正如内部异常所述,某些文件丢失了。由你来找到哪一个!

标签: c# wpf mvvm .net-4.0


【解决方案1】:

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

  • StartupProject → ViewsRoot
  • ViewsRoot → ViewModelsRoot
  • ViewModelsRoot

“StartupProject”有“exe”输出类型,而另外两个有“dll”。

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

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

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

【讨论】:

  • 这很有趣。我遇到了同样的问题并通过此修复解决了它,但对我来说这是一个肮脏的修复。我不想在我的启动项目中有那个参考,我确实希望我的项目独立。我注意到这在过去从未发生在我身上,但过去我总是对 ViewModel 有一些编码参考。所以... 一个不太明显的技巧是在您的 Views 项目中添加一个私有类,然后随意调用它,然后在 ViewModel 项目中的 ViewModel 中添加一个字段。它甚至不必实例化,仅供参考。
【解决方案2】:

我经常在项目目标框架设置为“Client Profile”时发现此错误(这是在VS2010,IIRC上默认设置的),如果是这种情况,请尝试将其更改为3.5或4.0。

【讨论】:

  • 对不起。不走运 - 它是 .net4-Full Profile。
  • 你有机会上传你的项目让我看看吗?
猜你喜欢
  • 2013-07-02
  • 2013-11-02
  • 1970-01-01
  • 2011-08-03
  • 2010-10-19
  • 1970-01-01
  • 1970-01-01
  • 2012-12-13
相关资源
最近更新 更多