2013-04-17 75 views
0

我有一個奇怪的問題,我似乎無法找到任何答案。MVVM輕,Metro應用程序,繼承ViewModelBase打破設計模式

我正在使用MVVM Light通過NuGet使用Visual Studio 2012構建Metro Store應用程序。

在設計和添加數據上下文xaml代碼時,studio給我帶來了錯誤「對象引用未設置爲對象實例」的紅色swiggly。

DataContext={Binding MainVM, Source={StaticResource Locator}} 

我終於把它縮小到我的viewmodel中的繼承。我有一個基礎視圖模型,我所有的ViewModels繼承宣佈爲:所有我的ViewModels這樣

public class BaseViewModel : ViewModelBase 
{ 
} 

那麼很明顯:現在

public class MainViewModel : BaseViewModel 
{ 
} 

,在運行時的一切工作完全正常(這是混亂我),但設計模式打破了。

但是,如果我刪除繼承和有我的ViewModels直接繼承ViewModelBase,一切都在設計模式罰款:

public class MainViewModel : ViewModelBase 
{ 
} 

我想,也許什麼東西在代碼中導致一個問題,所以我評論除了編譯所需要的東西外,所有的東西都完成了,並且仍然收到相同的結果

任何人似乎都有這個問題,或知道我可能做錯了嗎?我通常在使用MVVM處理Silverlight或WPF應用程序時使用相同的模式,並且在那裏看起來很好。

只是一個旁註,我的ViewModelLocator確實有一個返回MainViewModel類的MainVM屬性。

UPDATE 閱讀LBugnion和威爾的意見後,我正準備調試設計模式時,我注意到我goofily已經忘記了在BaseViewModel註釋掉我的代碼。我確實發現那裏有破壞代碼。設計模式不喜歡以下行:

private CoreDispatcher UIDispatcher = Windows.UI.Core.CoreWindow.GetForCurrentThread().Dispatcher; 

我正在用它來更新代碼中的UI線程。我猜測(哪個更有經驗的人可能會參與其中)在設計模式中沒有UI線程?

通常我使用「IsInDesignMode」屬性,以使我的ViewModels幾乎非功能性的設計,但顯然忘了所以在這裏做,所以我改變以上

private CoreDispatcher UIDispatcher = IsInDesignModeStatic ? null : Windows.UI.Core.CoreWindow.GetForCurrentThread().Dispatcher; 

我混日子行

+0

我經常這樣做,所以通常這不應該打破設計模式。必須在某個地方拋出異常,你是否嘗試調試設計模式代碼? – LBugnion

+0

是的,我通常也和其他技術一樣,所以我認爲這可能是地鐵的事情。顯然我錯了,我搞錯了我的調試(正如上面更新中所述),所以現在一切正常。謝謝! –

回答

2

總是會發生,主要是因爲您的類型中的代碼正在設計器中執行。

是的,代碼實際上可以在設計器中執行。設計人員會將裝配加載到設計表面的AppDomain中,實例化您的類型,並將該實例用於設計圖面。

因此,如果你有這樣的事情:

public MyView : UIElement 
{ 
    public MyView() 
    { 
     InitializeComponent(); 
     var database = GetDatabaseObject(); 
     database.OpenLikeWeAreInProduction(); 
     FillTheUiLol(database.GetAllKindsOfCrap()); 
    } 
} 

它最有可能會打破作爲數據庫不存在,你無法找到連接字符串從app.config中,等等等等。

處理這個問題的方法是,無論何時你有可能在設計器中執行的代碼(例如在構造函數中,在屬性更改事件處理程序等中),您應該使用DesignerProperties.GetInDesignMode(new DependencyObject())來確定您是否在設計師在執行代碼之前必須保證在設計器中打破。

不幸的是,有時很難確定什麼代碼正在破壞。我難以推斷的失敗的唯一解決方案是注意異常類型,旋轉另一個Visual Studio實例,附加到第一個,然後將調試配置爲始終爲該異常類型打破。

+1

給你答案打勾請問因爲你給的方法是在這種情況下幫助調試的好方法。如果我還沒有發現問題,我肯定會發現使用此解決方案的問題。謝謝! –