如何阻止我的ViewModel代码在设计器中运行?

时间:2010-09-21 05:51:05

标签: wpf mvvm designer

我正在使用MVVM模式开发一个联网的WPF应用程序,它似乎正在运行并连接到设计器中的服务器。

我知道IsInDesignMode属性,但我不确定如何在ViewModel中访问它。

6 个答案:

答案 0 :(得分:30)

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

答案 1 :(得分:21)

只是为了添加这些建议,您可能希望针对生产部署进行优化。

如果您需要在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

答案 2 :(得分:8)

我想我会加入这个,因为我只是查看了我在VS2015中发现的东西,它提供了另一种解决方案。在设计器中有一个按钮,用于禁用项目代码&#34;。

我假设你的ViewModel正在被实例化并且从你的代码背后做的事情。我知道它打破了纯MVVM,但我发现很多人在后面的代码中的构造函数中做了DataContext = new MyViewModel();之类的东西。

切换此按钮可以解决该问题,并有助于保持代码清洁。结帐MSDN了解详情。

这里是MSDN文档中的图像,因此您可以了解它的外观。无论如何,我确定链接最终会破裂。

enter image description here

我在VS2015中发现了这一点,但不确定添加了哪个版本的功能。

作为旁注,它也是一种重新加载设计师的好方法。虽然我尝试时速度很慢。你的milage可能会有所不同。

答案 3 :(得分:4)

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

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

答案 4 :(得分: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>

让你的设计时viewmodel从运行时viewmodel继承,但是在构造函数中模拟数据。您可能还需要对运行时视图模型执行某些操作,因此设计时viewmodel不会运行数据访问代码。

答案 5 :(得分:1)

这完全取决于您如何设置视图和视图模型之间的绑定。如果它是由构造函数中的视图启动的(似乎可能出现症状),则可以从那里检查IsInDesignMode。否则,您需要提供对架构(或框架,如果您使用任何架构)的快速概述。