2012-01-26 41 views
2

我不覺得讓任何對象成爲我的視圖的DataContext。當我跟隨MVVM模式時,所有窗口都有自己的虛擬機。我打算做如下(從窗口取稱爲選項):是否有什麼錯誤限制DataContext窗口的ViewModel?

internal new OptionsVM DataContext 
    { 
     get 
     { 
      return (OptionsVM) base.DataContext; 
     } 
     set 
     { 
      if (this.DataContext != value) 
      { 
       base.DataContext = value; 
      } 
     } 
    } 

你還是看看如果我失去了一些東西,如果這是個壞主意,由於一些我不知道的?

在此先感謝。

回答

2

通常,隱藏界面元素會導致奇怪的錯誤。例如,下面的代碼將產生一個InvalidCastException

OptionsView view = new OptionsView(); 
Window window = view; 
window.DataContext = new DifferentVM(); 
OptionsVM = view.DataContext; 

這是一個有些人爲的例子,但如果你曾經使用WPF綁定設置對象的DataContext的那麼類似的情況是非常可能的。

我發現最好讓DataContext屬性存在,因爲它的設計,而是給我的視圖一個構造函數接受一個更強類型的數據上下文。在查看的代碼,我也有相應類型的視圖模型屬性:

public OptionsView(OptionsVM viewModel) 
{ 
    DataContext = viewModel; 
} 

private OptionsVM ViewModel { get { return DataContext as OptionsVM; } } 
+0

我喜歡你的構造方法,但我不同意視圖屬性。當我試圖讓代碼背後的代碼越容易編碼越好,則會適得其反。 –

+0

在ctor執行之後,你如何阻止其他人更改'DataContext'的數據類型? – SliverNinja

+1

你不會也不會。 WPF的綁定系統實際上並不想強類型化,而且在打擊時沒有意義。 Ctor和財產真的只是爲人類的利益而榮耀的文件。 –

2

我能看到的唯一問題是,如果你使用結構

Window view = new OptionsView(); 

view.DataContext = ....; 

然後在DataContext仍然是類型的對象 - 它需要你總是使用視圖的類型的引用,看看你的強打字

+0

我同意,但是反正到現在爲止使用通用的做法我沒有必要......這是一個有點難看,因爲在一些地方我計劃在屬性上添加一些代碼,如果有人使用您的方法,將不會調用... –

+0

理想情況下 - 您只需觸摸XAML綁定中的「DataContext」 - 您應該避免在代碼隱藏中操縱上下文。雖然好點。 +1 – SliverNinja

1

你的方法應該沒有危險 - 如果它使你更容易,執行它。只要確保你評論你爲什麼選擇以這種方式實施它。我都是爲了更強大的數據類型在基礎Object類。我認爲這實際上使支持的上下文更清晰。

即使使用@SeanU建議的構造函數方法也不會阻止其他人在創建後更改DataContext類型。

+0

請記住,我打電話給base.DataContext,所以我不確定你說的是真的。 –

+0

這對MVVM有什麼好處?在你的XAML綁定中,無論如何你的類型是不可知的 - 不管類型是什麼。如果你需要從後面的代碼中操作DataContext,這不是一個好兆頭 - 對嗎?我想你只是在尋找一種方法來限制可以用'DataContext'處理的對象的類型 - 也許不能操縱它。 – SliverNinja

+1

只是爲了儘量避免錯誤而儘可能使用硬鍵。 –