2011-06-30 23 views
0

這兩個變體(性能,內存泄漏或指南)有區別嗎?有必要對WPF MVVM中的ICommand類型的屬性使用INotifyPropertyChanged?

隨着NPC:

private ICommand mGoBackCommand; 

    public ICommand GoBackCommand 
    { 
     get { return mGoBackCommand; } 
     set 
     { 
      if (mGoBackCommand != value) 
      { 
       mGoBackCommand = value; 
       RaisePropertyChanged("GoBackCommand"); 
      } 
     } 
    } 

自動屬性:

public ICommand GoBackCommand {get; set;} 

UPD: 最後一個問題是: 我可以使用自動屬性在VievModel如果他們將一次分配簡單的命令構造函數,或者我需要在VM的每個屬性上實現NPC,因爲性能,內存泄漏或其他問題?

+0

自動屬性引發PropertyChanged事件嗎? – stijn

+0

@stijn不,它不 – Alexander

+0

然後你實際上比較蘋果和橙子,不是嗎? – stijn

回答

5

如果您正在編寫一個實現INotifyPropertyChanged的類,那麼您正在制定一個合同,指出「當任何屬性發生更改時,我會提出PropertyChanged事件。」

但是,如果您知道某個財產在該實例的生命週期內不會發生變化,那麼您通過永不提高該財產的PropertyChanged來平凡滿足該合同。因此,如果你在構造函數中設置了一個屬性(「設置它是一個忘記它」的屬性),那麼你不需要修改屬性來支持INotifyPropertyChanged,你可以使用自動實現的屬性。然而,在這個你應該將財產從:

public ICommand GoBackCommand { get; set; } 

這樣:

public ICommand GoBackCommand { get; private set; } 

,以便它不會意外類之外修改。

+1

私人二傳手是必須的。感謝您在答案中包含這一點。 –

1

如果有任何東西綁定到GoBackCommand,那麼只有通過INPC或通過DependencyProperty實現更改通知時,對其的更改纔會傳播到綁定目​​標。否則,綁定目標將不知道該屬性已更改,並保留第一次綁定時所拉取的值。

0

我從來沒有見過人們使用NPC的命令。正如你所提到的,你只需要在ctor上初始化它,那麼讓NPC連接它有什麼意義呢?

你是否在運行時改變你的命令?如果沒有,就沒有必要。

您可以使用綁定:

<Button Content="Go Back" Margin="30,10" Command="{Binding GoBackCommand}"/>

3

對於其中該命令是施工過程中分配的方案,提高PropertyChanged事件是沒有必要的。但是,有些情況下您可能希望根據視圖模型狀態的變化來更改命令(例如,許多媒體播放器都有一個用於播放和暫停的按鈕,當媒體播放時您想要更改命令備份它暫停,當它暫停時,你想改變它播放)。在這些情況下,您應該爲命令使用PropertyChanged事件...或者您可以保留相同的命令,並根據狀態處理要執行的操作的邏輯。

希望這會有所幫助。