2013-10-31 15 views
6

我正在嘗試使用MVVM的一些不同的東西。在我們的ViewModel屬性中,綁定到View是公共的。我正在採取一個按鈕綁定的例子。這是一個簡單的例子。在ViewModel中製作綁定屬性的內部而不是公共

View.xaml:

<Button Content="Test Button" Command="{Binding TestButtonCommand}" /> 

ViewModel.cs

private ICommand _testButtonCommand; 
public ICommand TestButtonCommand 
{ 
    get { return _testButtonCommand?? (_testButtonCommand= new RelayCommand(SomeMethod)); } 
} 

這裏,我的問題是,我們可以讓內部的TestButtonCommand而不是公衆?內部意味着它可以被當前的項目訪問,所以他們不應該有這樣的問題嗎?但是,當我試圖做到這一點,它沒有奏效。在getter中添加一個斷點未被命中。那麼爲什麼我們不能做到內部。

這是msdn的鏈接。

http://msdn.microsoft.com/en-us/library/ms743643.aspx

屬性您使用的綁定,綁定源屬性必須是你的類的公共屬性。顯式定義的接口屬性不能用於綁定目的,也不能訪問沒有基本實現的受保護的,私有的,內部的或虛擬的屬性。

爲什麼我們不能這樣做?如果在同一個項目中工作,內部訪問與公共內容相同。那麼爲什麼我們不能在這裏使用內部。必須有一個理由,這些應該公開,我正在尋找這個原因。

internal ICommand TestButtonCommand { ...... } 
+3

因爲[只能綁定到公共屬性,子屬性和索引器或任何CLR對象](http://msdn.microsoft.com/zh-cn/library/ms743643.aspx)。爲什麼WPF團隊會參與這樣的設計決策?我不知道,你應該問他們:) –

+0

它的微軟,所以我們不能做任何事情, –

回答

11

在內部訪問的情況下,如果在同一個 項目中工作,則與public相同。那麼爲什麼我們不能在這裏使用內部。必須有一個原因 這些應該公開,我正在尋找這個原因。

你只有在你的問題的答案,因爲內部只能在同一個程序集內訪問,而不能從外部訪問。這是綁定到內部的唯一原因不起作用,因爲綁定是通過綁定引擎解決的,而不是通過您的程序集和它的單獨程序集PresentationFramework.dll來解決的,如果您正在尋找它。

+2

那麼,怎麼可能綁定到視圖模型類,它本身就是內部的? –

+1

男人,哦,男人在Winforms中讓我瘋狂。明顯但並非全部在同一時間。謝謝。 –

7

Binding僅支持公共屬性。 MSDN參考:

http://msdn.microsoft.com/en-us/library/ms743643.aspx

正如參考報價

您使用的綁定,綁定源屬性必須 是你的類的公共屬性,這些屬性。顯式定義的接口 屬性不能用於綁定目的,也不能被保護, 私有,內部或虛擬屬性沒有實現基本的 。

+0

我想在這裏找到的是爲什麼我們不能使用內部。如果我們在同一個項目中工作,這與公衆一樣。 –

0

創建內部屬性打破良好的OO設計,正在破解封裝。 您可以爲您的案例使用內部設置訪問器(和公共獲取訪問器)。

public ICommand SaveCommand 
{ 
    get; 
    internal set; 
} 

如果你有封裝成一個屬性字段,你應該讓一個規則始終可以訪問該字段throught甚至你的類中的屬性。這是最好的做法。

1

internal可見性實際上只對編譯器和IL驗證器有意義,因爲他們知道成員訪問的完整上下文; WPF綁定引擎不會。它知道綁定存在於一個屬性上;它不知道是誰設置的財產。它可以在XAML中設置,或者在運行時動態設置(技術上,即使您將它設置在XAML中,它仍然是動態應用的)。

由於沒有辦法強制執行訪問規則,因此允許綁定到internal屬性將等同於允許綁定到private屬性,而不是public屬性。

0

http://msdn.microsoft.com/en-us/library/ms743643.aspx

對於CLR屬性,數據綁定作品只要綁定引擎 能夠訪問使用反射綁定源屬性。 否則,綁定引擎會發出警告,指示無法找到屬性 ,並使用回退值或默認值(如果 可用)。

2

顯然,這取決於你想從這種情況中實現的目標 - 你沒有說明總體目標是什麼。我剛剛遇到了與我的代碼類似的問題,也發生了針對我的案例的解決方案。 我的一個庫包含具有各種屬性的助手對象,但是當它們在應用程序項目中使用時,我只想看到對我有用的屬性 - 我想隱藏(例如)Command屬性。

我的解決方案,以從庫的「用戶」隱藏它們是對

<EditorBrowsable(EditorBrowsableState.Never)> 

屬性添加到承載很少或沒有興趣到我每個屬性。

希望能幫助別人!

相關問題