這是我們如何做到這一點正常:綁定工作沒有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
值(不會再有更多的事件發生)。但我的問題是關於查看:爲什麼查看能夠工作?它是否在後臺構建了更多的東西,還是一種檢查某些東西的邏輯?
Hmm..i'm不知道我理解你的榜樣。你說如果你沒有實現'OnPropertyChanged',視圖仍然有效(例如,在TextBox中改變值會更新TextBlock)_當然,視圖更新了Source(這就是你在'UpdateSourceTrigger'時設置的原因)。但在第二種情況下,如果您在視圖模型中更改了Test的值,則視圖將不會被通知,並且您將不會在視圖中看到該更新。 – Pikoh
@Pikoh,我的問題是爲什麼要用第一個視圖模型替換第二個還是可以的。我只是不理解其背後的邏輯是什麼:我們沒有完整的屬性,setter中沒有任何提升,但它對視圖沒有任何問題:綁定到多個元素中的相同屬性將正確跟蹤其值被改變。 – Sinatr
如果你想看看這個神奇行爲的完整工作示例,你可以看看我的問題[這裏](https://stackoverflow.com/q/46803196/1977871)。 – VivekDev