16

在使用 VS2012、WPF 4.5 和设计时数据,特别是 DesignInstance 属性时,我只花了几个小时来解决一个问题。

目标:我想在 VS2012 和 Blend 中的 WPF 项目(基于 MVVM)中提供设计时数据支持,但我终生无法让 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 中”,尽管智能感知可以很好地解决它,并且您已经检查了一千次名称空间和类名称都是正确的。

4

4 回答 4

30

我自己在 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

于 2014-10-03T19:04:55.657 回答
8

检查构建配置中的“平台目标”是否设置为“ AnyCPU ”。我的设置为“ x64 ”,所以设计师抱怨缺少类型。

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

我在“Blend for Visual Studio”中尝试打开我的 UserControl 时找到了解决方案。它对我来说是一个很好的例外。

PS:使用接受的答案后:使用“d:Type=vm:DesignAlertsViewModel”而不是“vm:DesignAlertsViewModel”我的控件可见,但没有显示示例数据。

于 2015-03-23T13:54:38.000 回答
7

解决方法:确保设计时数据类与视图本身位于相同的命名空间中。一旦我将我的 DesignAlertsViewModel 移动到 View 命名空间,VS2012 和 Blend 设计器都立即开始处理设计时数据。

更新:这是目前的一种解决方法,直到我找到问题的根源。但是,就我而言,这是使设计时数据始终如一地工作的唯一方法。当然,如果您沿着这条路线走,您会更改类名称,因为 - 显然 - DesignAlertsViewModel 不再是视图模型。它现在只是一个包含设计时数据的 POCO。所以也许 AlertsDesignData 会是一个更好的名字。我对我的设计时数据位于我的 View 命名空间下这一事实并不太满意,但它确实有效。

我还鼓励您查看Laurent 在 MSDN 杂志中的文章,2013 年 4 月。我喜欢这种方法,因为它更多地运用了 MVVM 模式:设计时数据服务/提供者是通过 IOC 注入的,因此即使在设计时,您的视图模型也会得到“运用”。

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

此外,在重构 MVVMLight 方法期间,我确实必须重新启动 VS 几次——设计时数据只是消失了,并在 VS 重新启动后又回来了。但是,现在它似乎足够稳定,我无法进一步确定这一点。

于 2013-07-05T08:11:26.830 回答
0

我发现它DesignInstance在我的 .NET 3.5 和 .NET 4.0 项目中不起作用,而它在 >= .NET 4.5 项目中起作用(这些项目是相同的,它们通过使用链接共享相同的文件)。

于 2016-09-01T12:16:48.630 回答