2010-09-21 80 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可能會有所不同。

相關問題