我正在使用MVVM模式开发一个联网的WPF应用程序,它似乎正在运行并连接到设计器中的服务器。
我知道IsInDesignMode属性,但我不确定如何在ViewModel中访问它。
答案 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文档中的图像,因此您可以了解它的外观。无论如何,我确定链接最终会破裂。
我在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。否则,您需要提供对架构(或框架,如果您使用任何架构)的快速概述。