在Blend设计时使用Moq

时间:2010-03-25 08:08:24

标签: 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.Object; // this throws!  
      }
   }
}

模拟可以设置为做一些事情,但你明白了。

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

知道为什么会这样吗?

谢谢!

3 个答案:

答案 0 :(得分:1)

我有一个类似的问题,除了演员表来自动态生成的程序集(Blend_RuntimeGeneratedTypesAssembly)类型,伪装成我的类型之一。

没有明显的理由。

这让我疯狂。

答案 1 :(得分:1)

我曾经认为我需要做这种技巧但经过多次体验和搜索后,发现Blend 4现在可以根据现有的类创建设计时样本datacontexts。

这有效地为您提供了一个看起来就像您的VM类的虚拟类,以便您可以添加绑定等。

它运作良好,这是我们现在推荐的技术。

这可能的缺点是,如果您需要真正的VM来执行某种交互,那么代理当然不能这样做 - 您必须手动更改值,或交换到另一个设计时对象。但在实践中,我很少遇到这种情况。大多数情况下,您设置VM的状态,然后花费时间来看起来正确。

答案 2 :(得分:1)

更新:在github上发布:https://github.com/GeniusCode/GeniusCode.Components.DynamicDuck

在设计时尝试使用castle来模拟视图模型时,我也遇到了类似的问题。我们编写了自己的msil duck / mock库,它可以很好地用于此目的。

我在这里写了博客:http://blogs.geniuscode.net/JeremiahRedekop/?p=255

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