2011-09-08 64 views
5

我從來沒有使用INotifyPropertyChanged,我正考慮在整個新應用程序中廣泛使用它。INotifyPropertyChanged數據綁定外的用法

我的問題是,是「適當的」使用INotifyPropertyChanged接口,以比數據綁定控件其他東西提供活動通知?

它從一堆的例子在線看來,這個接口被廣泛用於通知網格和這樣當數據被改變。我有各種各樣的場景,我需要其他類來通知其他類中的數據更改,我想知道是否認爲實現此接口更清晰,並且對setter執行更改的調用,或者只是創建常規事件。

+3

只是出於好奇:爲什麼執行一個getter更改的調用? – WaltiD

+0

感謝您指出,並不意味着包括這一點。我已經更新了這個問題。 – mservidio

回答

4

當然,如果做出這樣的選擇,我傾向於使用超過其他構造的語言特徵。

INotifyPropertyChanged的嚴重缺點是它只提供屬性名稱作爲更新時的字符串,並且您的消費類必須解析該字符串並決定如何對其執行操作。

隨着事件,你可以提供任何形式的委託簽名的該事件需要和消費類可以直接在該變化問題採取行動。

如果引擎蓋下偷看,你會發現,INotifyPropertyChanged的是一個事件,無論如何,那麼爲什麼不直接使用事件?

+0

我傾向於使用常規活動。我同意,事情強類型事件將更好地合作。由於我使用的是T4代碼生成模板,您認爲在我的課程中爲每個屬性添加更改後的事件會是多麼的矯枉過正? – mservidio

+0

@mservidio - 我不熟悉T4,但我敢打賭,你可以更新一個更清晰的課堂行爲,而不是每個屬性。 –

2

我想你可以使用這個接口對於那些情景,但是你要真正好好想想,如果你想你的類之間的這種thight coupeling。 如果這對你有意義 - 當然,爲什麼重新發明輪子?

1

我認爲你應該繼續實現INotifyPropertyChanged接口,僅僅因爲它是爲了這個目的而且它的用戶界面用來獲取更改,所以不需要自己創建自定義事件。

0

WPF和Silverlight都在數據綁定系統中廣泛使用INotifyPropertyChanged。如果您要將數據綁定到您的對象,則應該定義使用INotifyPropertyChanged。 |

否則,據我所知,它不影響.NET Framework技術。

INotifyPropertyChanged不是您的屬性更改時通知的最清潔的方式,具體取決於您如何查看它,因爲有一個事件和一個帶有屬性名的字符串,您將不得不做一個switch語句。雖然

0

我不會使用INotifyPropertyChanged除了數據綁定之外的任何東西。此接口可能是數據綁定的唯一選項,因爲將在PropertyChanged事件上採取行動的控件事先不知道發件人的類型。由於數據綁定必須使用這樣的通用接口。

對於我自己的類型和場景,我會使用常規事件(每個屬性可以更改其值的一個事件)。在這種情況下INotifyPropertyChanged是一種字符串類型的代碼。你可以看到,即使WPF本身仍然充滿了oldscool事件(FrameworkElement例如有很多***Changed事件)。

0

我覺得INotifyPropertyChanged通常是約屬性值更新基於推送的通知的權利機制。

備選:

但是,它不是實現這一目標的唯一可能的機制。例如,Windows窗體也支持每個屬性單獨的…Changed事件;即如果您擁有名爲Foo的房產,則可能會在Foo的設置人員中觸發相關聯的FooChanged事件。

具有單獨的…Changed事件具有特定於某個特定屬性的優勢,因此不需要觀察者/訂閱者過濾掉他們不感興趣的屬性的通知。另一方面,您的(數據)一旦您必須聲明50個額外的…Changed事件,對象可能開始感覺「體積龐大」。

有關實現INotifyPropertyChanged一些注意事項:

  • 如果你厭倦了重新寫一遍又一遍相同的樣板代碼...:

    public T SomeProperty 
    { 
        get { … } 
        set 
        { 
         if (someProperty != value) 
         { 
          someProperty = value; 
          NotifyPropertyChanged("SomeProperty"); 
         } 
        } 
    } 
    private T someProperty; 
    

    ,那麼你可能想考慮一個AOP框架(如PostSharp)。我記得CodePlex或Google Code上有一個庫,可以爲你自動執行INotifyPropertyChanged(或重寫CIL字節碼);不幸的是我不記得圖書館的名字。

  • 還有其他相關接口INotifyPropertyChanging,INotifyListChanged等您也許也想看看這些。

0

不要使用在其他情況下,如果你需要通知其他領域類使用域事件,而不是,這將是更加商業化和描述性和強類型

0

我不是INPC的粉絲外因爲它隱藏了對象實例正在生成重要事件的事實。另外,如果我使用您的類實現INPC,我會期望所有屬性都可以廣播通知,如果只有其中一些屬性發生,那麼這是運行時可能會被忽視的錯誤。

相關問題