2011-08-04 26 views
3

在後面的XAML文件中的代碼,如果我的DataContext將永遠是一個著名的課,我通常重新聲明的DataContext像這樣:爲什麼不重新聲明DataContext屬性在WPF中,如果調用基

public new Cow DataContext 
{ 
    get { return base.DataContext as Cow; } 
    set { base.DataContext = value; } 
} 

這樣我有Intellisense在我的文件範圍內將DataContext視爲一個Cow,我安全地(至少我認爲是這樣)使用base.DataContext來處理其所有邏輯

有些人,有很多經驗,已經告訴我這不是一個好的模式。

我想知道可能會出現什麼問題,爲什麼不使用它。我已經給了很多心思和想不出一個

謝謝

+0

我假設你在你的.xaml.cs文件(後面的代碼)中重新聲明DataContext,因爲你在你的「xaml」中說過,但是發佈了c#代碼? – oXeNoN

+0

@scott我真的很抱歉,但我的意思是名爲DataContext而非Cow的屬性 –

+0

@Luis Filipe,我剛剛看到您更新的更改並刪除了我的評論。我明白你的意思了。 – Scott

回答

4

經過一段時間關於該代碼的思考後,我找不到任何嚴重的問題,除了我可能會解釋的這個角落案例。

假設您的Xaml屬於一個名爲MyUserControl的類,並且它從UserControl繼承。

讓我們假設你有:

UserControl ctrl = new MyUserControl(); 
ctrl.DataContext = new Dog(); 

這顯然是合法的,你是不是通過的MyUserControl的類型安全保護,因爲引用變量的類型是用戶控件,它的DataContext屬性是對象類型仍。然而,讓我們想象,下了線,你試試下面,在的MyUserControl的上下文:

Cow c = this.DataContext; 

Ç將是無效的。這是你的意圖。然而,這可能會讓你的生活在調試場景下變得更加困難,因爲你被認爲你的DataContext是空的,儘管它不是你期望的。可能難以理解爲什麼你的數據綁定在你的datacontext看起來都是空的時候都很有趣。

我的這種做法是不是隱藏DataContext屬性,而是通過一個新的屬性,再暴露它:

public Cow Model 
{ 
    get 
    { 
     return this.DataContext as Cow; 
    } 
    set 
    { 
     this.DataContext = value; 
    } 
} 

在我設置了上面,而Model屬性將返回空值的情況下, DataContext將返回一個對Dog實例的引用,更恰當地反映真正發生的事情。或者,你可能會返回以下實現您的DataContext屬性的getter:

return (Cow)this.DataContext; 

至少你會收到一個異常告訴你的DataContext確實有一些,但不是你想要的。然而,它似乎很俗氣。

無論如何,這真的不是嚴重問題,只是在我設計的場景下可能造成的不便。

+0

異常將是一個StackOverflowException :)。但我猜你的意思是(牛)base.DataContext –

+0

@Rui通過一個新的屬性暴露DataContext一直是我的解決方案,因爲我沒有被允許重新聲明DataContext; –

+0

@Rui要使用關鍵字'as'輕鬆地轉換DataContext可以有你說的缺點,但是強制轉換可能會引發一些不必要的異常 –

0

好吧,我不看到任何這方面的問題,這只是與智能感知幫助...它並沒有改變DataContext的依賴財產對牛無論如何...所以沒有類型的安全,就像綁定或樣式WPF功能而言。

相關問題