【问题标题】:How do you put your design time view model in a separate assembly?您如何将设计时视图模型放在单独的程序集中?
【发布时间】:2011-08-15 12:47:07
【问题描述】:

我将 MVVM Light 和 Prism 与视图模型定位器模式一起使用。我真的很喜欢在 Blend 中使用设计时视图模型,但我不一定希望将它与我的生产代码一起提供。有没有办法将设计时视图模型放在另一个程序集中,然后告诉视图模型定位器在那里找到它?似乎设计时程序集 (*.Design.dll) 可以帮助解决这个问题,但我不知道如何解决。

【问题讨论】:

  • 为什么不将 xaml 文件与 DesignData 构建操作一起使用?我已经回答了我已经解释了如何正确使用它的问题:stackoverflow.com/questions/5693283/…,但是提出这个问题的人想要的不是 Blend 中的设计数据。我想知道为什么每个人都不愿意使用如此简单的方法。
  • 我不使用 DesignData,因为我的生产视图模型大量注入了构造函数依赖项。这意味着没有默认构造函数,因此没有从 XAML 创建。 VML 定位器模式为我解决了所有这些问题。即使我遗漏了一些东西并且可以将 DesignData 与注入构造函数的 VM 混合使用,它仍然会在生产程序集中留下额外代码和资源的问题。所以我会转过身来:如果我使用 DesignData,我如何将设计资源字典放在另一个程序集中并让 Blend 加载它而无需运送该程序集?
  • 如果清除属性CustomTool(去掉MsBuild值)其实是没有这个问题的。之后,您将能够在没有默认构造函数的情况下定义模型。具有此操作的文件(DesignData 而不是 Page 或 Resource)将不会包含在最终程序集中。如果您不相信 - 您可以尝试使用反射器等反编译器打开程序集。
  • @vorrtex 这就是那个提示 - 这意味着我需要调整我的 ViewModel 类,但总的来说它比定义其他类更好。不过,您确实需要一个无参数的构造函数 - 即使您清除了自定义工具,如果没有该构造函数,设计时支持也无法工作。

标签: c# silverlight expression-blend mvvm-light viewmodellocator


【解决方案1】:

迈克,
将以下内容添加到您的 XAML..

xmlns:designTime="clr-namespace:MyDesignTimeNS;assembly=MyBinaryName"
d:DataContext="{d:DesignInstance designTime:DesignTimeObjectNameViewModel, IsDesignTimeCreatable=True}

有了这个,我可以将我的设计时数据保存在一个单独的二进制文件中,而不是分发它。

【讨论】:

  • 我没有想过将设计内容放在另一个程序集中的单独 xmlns 中,很好!我发现 IsDesignTimeCreatable 属性的问题会导致 Blend 出现很多异常,但这似乎是一个单独的问题。
猜你喜欢
  • 2020-12-10
  • 1970-01-01
  • 1970-01-01
  • 2010-09-06
  • 2023-03-19
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 2013-03-23
相关资源
最近更新 更多