2010-09-21 77 views

回答

28
DependencyObject dep = new DependencyObject(); 
if (DesignerProperties.GetIsInDesignMode(dep)) 
{ 
    ... 
} 
3

将设计时数据源中的XAML这样的:

<UserControl x:Class="Company.Product.View.MyView" 
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:vm="clr-namespace:Company.Product.ViewModel.Design" 
xmlns:design_vm="clr-namespace:Company.Product.ViewModel.Design" 
mc:Ignorable="d" Name="MyView"> 
<UserControl.Resources> 
    <ObjectDataProvider ObjectType="{x:Type design_vm:MyViewModel}" x:Key="DesignTime_DataSource" d:IsDataSource="True"/> 
</UserControl.Resources> 
<Grid d:DataContext="{StaticResource DesignTime_DataSource}"> 
.... 
</Grid> 
</UserControl> 

让你的设计时间视图模型从运行时间视图模型继承,但在构造函数中嘲笑了数据。您可能还需要对运行时视图模型进行一些操作,以便设计时视图模型不会运行数据访问代码。

+0

当以这种方式完成ViewModel中存在未处理的异常时,看起来像Visual Studio崩溃。 – 2010-09-22 04:56:05

+0

我的经验是,设计窗口优雅地坠毁,而不是整个工作室。 – Guge 2010-09-22 05:39:27

1

这一切都取决于您如何设置视图和视图模型之间的绑定。如果它是由构造函数中的视图启动的(看起来可能出现症状),那么可以从这里检查IsInDesignMode。否则,您需要提供一个非常快速的架构概述(或者如果您使用任何架构)。

+0

所有绑定都在XAML中完成,如Josh Smith关于MVVM的文章中所述。 – 2010-09-21 06:32:07

4

我在代码中使用以下语句,我只能在应用程序运行时执行,否则会在XAML设计器中导致异常。

 if (System.Windows.Application.Current.MainWindow != null) 
16

只是为了增加这些建议,您可能希望优化生产部署。

如果您需要检查ViewModel中的设计模式,则只能在DEBUG模式下执行此操作,否则发布的版本将始终需要执行不必要的检查。
开发时,如果在设计模式下,可以退出该方法(甚至可以删除一些伪造的数据)。

将这个代码作为构造函数的第一行(或任何代码被调用):

C#

#if DEBUG 
    if (DesignerProperties.GetIsInDesignMode(new DependencyObject())) return; 
#endif 

VB

#If DEBUG Then 
    If DesignerProperties.GetIsInDesignMode(New DependencyObject()) Then Return 
#End If 
5

我我想我会加入这个,因为我刚刚查找了一些我在VS2015中发现的东西,它提供了另一种解决方案上。在设计器中有一个“禁用项目代码”的按钮。

我假设你的ViewModel被实例化,并从你的代码中执行一些东西。我知道它打破了纯粹的MVVM,但我已经看到很多人在代码背后的构造函数中做类似DataContext = new MyViewModel();的东西。

切换此按钮应该可以解决该问题,并有助于保持代码清洁。结帐MSDN欲知更多信息。

下面是MSDN文档中的图像,以便您了解它的外观。无论如何,我确信这个链接最终会打破。

enter image description here

我在VS2015看准了这一点,但不知道其中加入了版本此功能。

作为一个便笺,它也加倍作为一个重新加载设计师的好方法。尽管我尝试时速度很慢。你的milage可能会有所不同。

相关问题