我正在开始一个新项目,并将我的项目结构定位在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绑定到同一程序集中的类。
答案 0 :(得分:3)
我使用三个项目解决方案重现了这个错误,它们之间具有指定的依赖关系:
“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)
当项目目标框架设置为“客户端配置文件”时(我在VS2010,IIRC上默认设置),我经常发现此错误,如果是这种情况,请尝试将其更改为3.5或4.0。