2016-12-05 102 views
3

這是我們如何做到這一點正常:綁定工作沒有INotifyPropertyChanged,爲什麼?

public class ViewModel : INotifyPropertyChanged 
{ 
    string _test; 
    public string Test 
    { 
     get { return _test; } 
     set 
     { 
      _test = value; 
      OnPropertyChanged(); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    public void OnPropertyChanged([CallerMemberName] string property = "") => 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property)); 
} 

現在我們的財產,可以在視圖中的多個元素中使用,例如:

<TextBox Text="{Binding Test, UpdateSourceTrigger=PropertyChanged}" /> 
<TextBlock Text="{Binding Test}" /> 

TextBox更改值將更新的內容TextBlock。以及我們可以在視圖模型中設置值,視圖將自動更新它。

如果我們這樣寫

public class ViewModel 
{ 
    public string Test { get; set; } 
} 

視圖模型,然後的觀點仍然是工作(例如在TextBox變化值將更新TextBlock)。當然,無法輕易更新視圖模型中的Test值(不會再有更多的事件發生)。但我的問題是關於查看:爲什麼查看能夠工作?它是否在後臺構建了更多的東西,還是一種檢查某些東西的邏輯?

+1

Hmm..i'm不知道我理解你的榜樣。你說如果你沒有實現'OnPropertyChanged',視圖仍然有效(例如,在TextBox中改變值會更新TextBlock)_當然,視圖更新了Source(這就是你在'UpdateSourceTrigger'時設置的原因)。但在第二種情況下,如果您在視圖模型中更改了Test的值,則視圖將不會被通知,並且您將不會在視圖中看到該更新。 – Pikoh

+0

@Pikoh,我的問題是爲什麼要用第一個視圖模型替換第二個還是可以的。我只是不理解其背後的邏輯是什麼:我們沒有完整的屬性,setter中沒有任何提升,但它對視圖沒有任何問題:綁定到多個元素中的相同屬性將正確跟蹤其值被改變。 – Sinatr

+0

如果你想看看這個神奇行爲的完整工作示例,你可以看看我的問題[這裏](https://stackoverflow.com/q/46803196/1977871)。 – VivekDev

回答

4

[...]您遇到WPF的 另一個隱藏方面,就是它WPF的數據綁定引擎將 數據綁定到它包裝源 屬性的PropertyDescriptor例如,如果源對象是一個普通的CLR對象並且不會 實現INotifyPropertyChanged接口。並且數據綁定 引擎將嘗試通過 PropertyDescriptor.AddValueChanged()方法訂閱屬性更改事件。並且當綁定元素的目標數據 更改屬性值時,數據綁定引擎將調用PropertyDescriptor.SetValue()方法將已更改的 值傳回源屬性,並且它將同時引發 ValueChanged事件以通知其他訂閱者在這種情況下, 其他用戶將是的TextBlocks列表框之內。

而且如果要實現INotifyPropertyChanged的,你完全 負責實施的 每一個二傳手變更通知其需要綁定數據的屬性到用戶界面,否則, 更改將不會像您期望的那樣同步。

參見:Data binding without INotifyPropertyChanged

+0

好的,所以查看每個綁定到'ValueChanged'事件的訂閱,並在更新源時自動增加通知。這解釋了它是如何工作的,謝謝。 – Sinatr

相關問題