Wpf 在混合设计时使用最小起重量

Wpf 在混合设计时使用最小起重量,wpf,silverlight,mvvm,expression-blend,design-time,Wpf,Silverlight,Mvvm,Expression Blend,Design Time,这可能有点离谱,但假设我想在ViewModel中使用Moq来创建一些设计时数据,如下所示: public class SomeViewModel { public SomeViewModel(ISomeDependency dependency) { if (IsInDesignMode) { var mock = new Mock<ISomeDependency>(); dependency = mock.Ob

这可能有点离谱,但假设我想在ViewModel中使用Moq来创建一些设计时数据,如下所示:

public class SomeViewModel
{
   public SomeViewModel(ISomeDependency dependency)
   {
      if (IsInDesignMode)
      {
         var mock = new Mock<ISomeDependency>();
         dependency = mock.Object; // this throws!  
      }
   }
}
公共类SomeViewModel
{
公共SomeViewModel(ISomeDependency)
{
如果(IsInDesignMode)
{
var mock=new mock();
dependency=mock.Object;//这会抛出!
}
}
}
模拟可以被设置成做一些事情,但是你明白了

我的问题是,在Blend的设计时,这段代码抛出一个InvalidCastException,消息是“无法将'Castle.Proxies.ISomeDependencyProxy2b3a8f3188284ff0b1129bdf3d50d3fc'类型的对象强制转换为'ISomeDependency'。虽然这看起来不一定与Moq相关,但与Castle相关,我希望Moq示例有帮助;)

知道为什么吗


谢谢

我有一个类似的问题,除了强制转换来自一个动态生成的程序集(Blend_RuntimeGeneratedTypesAssembly)类型,该类型伪装为我的类型之一

没有明显的原因


这让我抓狂。

我曾经认为我需要做这种把戏,但经过大量的实验和搜索,发现Blend 4现在可以基于现有类创建设计时示例数据上下文

这有效地为您提供了一个与您的VM类相似的虚拟类,以便您可以添加绑定等

这是我们现在推荐的技术,它工作得很好


这样做的一个可能的缺点是,如果您需要真正的VM执行某种交互,那么代理当然无法做到这一点——您必须手动更改值,或者交换到另一个设计时对象。但实际上,我很少遇到这种情况。大多数情况下,您需要设置虚拟机的状态,然后花很长时间才能获得正确的外观。

更新:在github上发布:

在设计时尝试使用castle模拟viewmodels时,我也遇到了类似的问题。我们编写了自己的msil duck/mock库,它为此目的工作得很好

我在这里写了一篇博客:


我们正致力于在MS-PL下发布库,并在GitHub上部署。

这是由针对完整框架的类型assembly A和针对客户端工厂的设计时数据项目B造成的。导致了各种奇怪的事情发生。