6

我正在开始一个新项目,并将我的项目结构定位在这个问题中推荐的结构上。

现在我看到了奇怪的行为。当我在 View-XAML 中设置数据上下文时,在运行时找不到它(获取 a 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:

感谢您的评论,但我没有忘记命名空间。我在这里缩短了它以显示代码,但我(再次)进行了双重和三重检查。DataContexts 命名空间也由智能感知填充。整篇<viewModels:ShellViewModel />都是intelli-sense写的。所以它是在设计时发现的......所以还有更多想法吗?

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

4

2 回答 2

3

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

  • 启动项目 → 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”复制到输出文件夹中,但更改代码时不会更新。

于 2015-09-17T12:01:58.057 回答
-1

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

于 2012-10-24T16:28:15.893 回答