查看不不同的装配找到视图模型

问题描述 投票:6回答:2

我开始一个新项目,面向在this question建议的结构我projectstructure。

现在我看到奇怪的行为。当我设置的视图,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公钥=空\“或它的一个依赖没有被发现。该系统不能找到指定的文件。”}

而唯一的内部异常,我可以看到的是一个System.IO.FileNotFoundException

更新2:

感谢您的意见,但我没有忘记一个命名空间。我缩短了它这里展示的代码,但我双精度和triplechecked(再次)。该DataContexts命名空间还通过智能感知填充。整个<viewModels:ShellViewModel />由智能影音感觉写的。因此,它在设计时发现......所以任何更多的想法?

更新3:XAML是“正确的”解析为我能够在DataContext绑定到一个类在同一个组件。

c# wpf mvvm .net-4.0
2个回答
3
投票

我已复制使用三个项目的解决了这个错误,与它们之间的指定的依赖:

  • 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”复制到输出文件夹直接,但是当你改变代码就不会被更新。


-1
投票

我经常发现这个错误时,该项目的目标框架设置为“客户档案”,如果是这样的情况下,尝试将其更改为3.5或4.0(这是默认的VS2010,IIRC设置)。

© www.soinside.com 2019 - 2024. All rights reserved.