【发布时间】:2011-04-15 00:46:42
【问题描述】:
我正在使用 MVVM 模式开发一个联网的 WPF 应用程序,它似乎正在运行并连接到设计器中的服务器。
我知道 IsInDesignMode 属性,但我不确定如何在 ViewModel 中访问它。
【问题讨论】:
我正在使用 MVVM 模式开发一个联网的 WPF 应用程序,它似乎正在运行并连接到设计器中的服务器。
我知道 IsInDesignMode 属性,但我不确定如何在 ViewModel 中访问它。
【问题讨论】:
DependencyObject dep = new DependencyObject();
if (DesignerProperties.GetIsInDesignMode(dep))
{
...
}
【讨论】:
除了这些建议之外,您可能还想针对生产部署进行优化。
如果您需要检查 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
【讨论】:
我想我会补充一下,因为我刚刚查找了我在 VS2015 中发现的一些内容,它提供了一个替代解决方案。在设计器中有一个“禁用项目代码”按钮。
我假设您的 ViewModel 正在被实例化并从您的代码后面做一些事情。我知道它破坏了纯 MVVM,但我看到很多人在后面代码的构造函数中做类似DataContext = new MyViewModel(); 之类的东西。
切换此按钮应该可以解决该问题并有助于保持代码更简洁。结帐MSDN了解更多信息。
这是 MSDN 文档中的图片,您可以了解它的外观。无论如何,我确信链接最终会断开。
我在 VS2015 中发现了这个,但不确定这个功能是在哪个版本中添加的。
附带说明,它还兼作重新加载设计器的好方法。虽然我尝试的时候很慢。您的里程可能会有所不同。
【讨论】:
我对只能在应用程序运行时执行的代码使用以下语句,否则会在 XAML 设计器中导致异常。
if (System.Windows.Application.Current.MainWindow != null)
【讨论】:
在您的 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>
让您的设计时视图模型继承自运行时视图模型,但在构造函数中模拟数据。您可能还必须对运行时视图模型做一些事情,这样设计时视图模型就不会运行数据访问代码。
【讨论】:
这完全取决于您如何设置视图和视图模型之间的绑定。如果它是由构造函数中的视图启动的(这似乎很可能给出症状),您可以从那里检查 IsInDesignMode。否则,您需要提供一个非常快速的架构概览(或框架,如果您使用的话)。
【讨论】: