我开始一个新项目,面向在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绑定到一个类在同一个组件。
我已复制使用三个项目的解决了这个错误,与它们之间的指定的依赖:
“StartupProject”有“EXE”输出类型,而其它两个具有“DLL”。
就我而言,我加入“ViewModelsRoot”到“StartupProject”的引用列表中解决了这个问题。这不是一个编码问题,而是一个运行时的问题,因为“ViewModelsRoot.dll”不被复制到“StartupProject”输出文件夹。
当您指定的代码隐藏在DataContext时,Visual Studio注意到该“DLL”的需要,并把它添加到编译后的输出。从设置XAML中的DataContext时,这不会发生。因为“ViewModelsRoot”的代码是从XAML使用反射这是棘手的。将它添加到引用列表强制的Visual Studio在这两种情况下复制“DLL”。
您也可以“ViewModelsRoot.dll”复制到输出文件夹直接,但是当你改变代码就不会被更新。
我经常发现这个错误时,该项目的目标框架设置为“客户档案”,如果是这样的情况下,尝试将其更改为3.5或4.0(这是默认的VS2010,IIRC设置)。