【问题标题】:How do I stop my ViewModel code from running in the designer?如何阻止我的 ViewModel 代码在设计器中运行?
【发布时间】:2011-04-15 00:46:42
【问题描述】:

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

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

【问题讨论】:

    标签: wpf mvvm designer


    【解决方案1】:
    DependencyObject dep = new DependencyObject();
    if (DesignerProperties.GetIsInDesignMode(dep))
    {
        ...
    }
    

    【讨论】:

      【解决方案2】:

      除了这些建议之外,您可能还想针对生产部署进行优化。

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

      【讨论】:

        【解决方案3】:

        我想我会补充一下,因为我刚刚查找了我在 VS2015 中发现的一些内容,它提供了一个替代解决方案。在设计器中有一个“禁用项目代码”按钮。

        我假设您的 ViewModel 正在被实例化并从您的代码后面做一些事情。我知道它破坏了纯 MVVM,但我看到很多人在后面代码的构造函数中做类似DataContext = new MyViewModel(); 之类的东西。

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

        这是 MSDN 文档中的图片,您可以了解它的外观。无论如何,我确信链接最终会断开。

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

        附带说明,它还兼作重新加载设计器的好方法。虽然我尝试的时候很慢。您的里程可能会有所不同。

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            【解决方案5】:

            在您的 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 中存在未处理的异常时,Visual Studio 似乎会崩溃。
            • 我的经验是设计窗口会优雅地崩溃,而不是整个工作室。
            【解决方案6】:

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

            【讨论】:

            • 所有绑定都在 XAML 中完成,如 Josh Smith 关于 MVVM 的文章中所述。
            猜你喜欢
            • 1970-01-01
            • 2014-11-07
            • 1970-01-01
            • 2021-12-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-03-08
            • 2013-07-10
            相关资源
            最近更新 更多