DesignInstance无法在VS2012中运行

时间:2013-07-05 08:11:27

标签: wpf mvvm visual-studio-2012 blend design-time-data

使用VS2012,WPF 4.5和设计时数据,特别是DesignInstance属性时,我只花了几个小时处理问题。

目标:我想在我的WPF项目(基于MVVM)中获得设计时数据支持,无论是在VS2012还是Blend,我都无法在生活中制作MVVMLight方法工作始终如一

所以我尝试使用内置的设计时数据支持更改为“只是”,使用Blend提供的标记扩展。

问题:请考虑以下代码:

<Window x:Class="Nova.View.AlertsView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:local="clr-namespace:Nova.View"
        xmlns:vm="clr-namespace:Nova.ViewModel"
        mc:Ignorable="d"
        DataContext="{Binding Alerts, Source={StaticResource Locator}}" 
        d:DataContext="{d:DesignInstance vm:DesignAlertsViewModel, IsDesignTimeCreatable=True}"
... />

VS2012和Blend都报告“名称DesignAlertsViewModel在命名空间clr-namespace中不存在:Nova.ViewModel”,即使intellisense解决它很好,你已经检查过一千次命名空间和类名都是正确的。

4 个答案:

答案 0 :(得分:28)

我在VS2013中遇到了这个错误然后发现了这个问题。经过更多搜索,我找到了一个帮助我解决问题的答案。

而不是

d:DataContext="{d:DesignInstance vm:DesignAlertsViewModel, IsDesignTimeCreatable=True}"

使用

d:DataContext="{d:DesignInstance d:Type=vm:DesignAlertsViewModel, IsDesignTimeCreatable=True}"

我正在使用“... d:DesignInstance Type = vm:...”并显示上述相同的错误。一旦我添加“d:”一切正常。

这是我发现帮助的主题。

https://stackoverflow.com/a/21690404/2892400

答案 1 :(得分:8)

检查&#34;平台目标&#34;在您的构建配置中设置为&#34; AnyCPU &#34;。我被设置为&#34; x64 &#34;,因此设计师抱怨丢失的类型。

VS以32位运行,因此从64位程序集执行代码可能存在问题。

我尝试在&#34; Blend for Visual Studio&#34;中打开我的UserControl时找到了解决方案。它给我显示了一个简洁的例外。

P.S。:使用接受的答案后:使用&#34; d:Type = vm:DesignAlertsViewModel&#34;而不是&#34; vm:DesignAlertsViewModel&#34;我的控件可见,但没有显示示例数据。

答案 2 :(得分:7)

解决方法:确保设计时数据类与View本身位于同一名称空间中。将DesignAlertsViewModel移动到View命名空间后,VS2012和Blend设计器立即开始使用设计时数据。

更新:这是现在的解决方法,直到我找到问题的根源。但是,就我而言,这是使设计时数据始终如一的唯一方法。当然,如果你沿着这条路走下去,你就改变了类名,因为 - 显然 - DesignAlertsViewModel不再是一个视图模型。它现在只是一个包含设计时数据的POCO。因此,AlertsDesignData可能是一个更好的名称。我对设计时数据存在于我的View命名空间下的事实并不过分,但它确实有用。

我也鼓励你看看Laurent's article from MSDN Magazine, April 2013。我喜欢这种方法,因为它更多地运用MVVM模式:设计时数据服务/提供者通过IOC注入,因此您的视图模型即使在设计时也会“运用”。

更新2 :在这又花了4个小时后,我认为陪审团仍然认为哪种方法更好:我们应该采用简单的POCO数据类还是MVVMLight方法,使用IOC用于设计时数据服务?前者很简单,需要的代码较少,后者更适用于MVVM方法,并且在某种程度上运用真实的视图模型,并且可能会发现一些错误。

另外,在重构MVVMLight方法期间,我确实需要重启VS几次 - 设计时数据就会消失,并在VS重启后返回。但是,现在它似乎足够稳定,我无法再进一步指出这一点。

答案 3 :(得分:0)

我发现DesignInstance在我的.NET 3.5和.NET 4.0项目中不起作用,而它在&gt; = .NET 4.5项目中工作(项目是相同的,他们共享使用链接获得相同的文件。