我正在開發一個帶有MVVM模式的聯網WPF應用程序,它似乎正在運行並連接到設計器中的服務器。如何阻止我的ViewModel代碼在設計器中運行?
我知道IsInDesignMode屬性,但我不確定如何在ViewModel中訪問它。
我正在開發一個帶有MVVM模式的聯網WPF應用程序,它似乎正在運行並連接到設計器中的服務器。如何阻止我的ViewModel代碼在設計器中運行?
我知道IsInDesignMode屬性,但我不確定如何在ViewModel中訪問它。
DependencyObject dep = new DependencyObject();
if (DesignerProperties.GetIsInDesignMode(dep))
{
...
}
將設計時數據源中的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。否則,您需要提供一個非常快速的架構概述(或者如果您使用任何架構)。
所有綁定都在XAML中完成,如Josh Smith關於MVVM的文章中所述。 – 2010-09-21 06:32:07
我在代碼中使用以下語句,我只能在應用程序運行時執行,否則會在XAML設計器中導致異常。
if (System.Windows.Application.Current.MainWindow != null)
只是爲了增加這些建議,您可能希望優化生產部署。
如果您需要檢查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看準了這一點,但不知道其中加入了版本此功能。
作爲一個便箋,它也加倍作爲一個重新加載設計師的好方法。儘管我嘗試時速度很慢。你的milage可能會有所不同。
當以這種方式完成ViewModel中存在未處理的異常時,看起來像Visual Studio崩潰。 – 2010-09-22 04:56:05
我的經驗是,設計窗口優雅地墜毀,而不是整個工作室。 – Guge 2010-09-22 05:39:27