Основная проблема реализации 1 состоит в том, что строковым параметром вашего метода OnPropertyChanged
должно быть точное имя свойства, которое изменяется. Для ваших двух примеров "model_changed"
следует изменить на "Model"
, а "name_changed"
- "Name"
. Вот два отличных метода, чтобы смягчить потенциальную человеческую ошибку с помощью набора буквенных имен строк:
1. Используйте атрибут CallerMemberName
Если вам разрешено и у вас есть доступ к пространству имен System.Runtime.CompilerServices
, вы можете написать свой базовый класс как таковой, чтобы имя свойства автоматически передавалось как строковый параметр OnPropertyChanged
method:
using System.ComponentModel;
using System.Runtime.CompilerServices;
public class Notifier : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged([CallerMemberName] string pName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(pName));
}
}
Затем вы можете просто позвонить OnPropertyChanged()
в получатель вашей собственности.
2. Используйте ключевое слово nameof
В качестве альтернативы, вы можете просто заменить имя свойства с буквенным типом на nameof(<InsertPropertyNameHere>)
, которое будет возвращать имя без какого-либо риска опечатки, как в этом примере:
Фарр и Humphreys, "физически основанный рендеринг", Morgan-Kaufman 2004
Wann Jensen, "реалистический синтез изображений Используя отображение фотона", AK Peters, 2001
Dutré, Бала и Baekert, "усовершенствованное глобальное освещение", AK Peters, 2006
Я могу рекомендовать Физически Основанный Рендеринг Фарром и Humphreys, который включает полный рендерер, записанный в C++ с помощью литературных методов программирования.
Не книга, но место, где я узнал все о трассировке лучей - Персистентность видения (POV).