Это наиболее обсуждаемый аспект спецификации Selectors Level 4. С помощью этого селектора вы сможете стилизовать элемент в соответствии с его дочерним элементом, используя восклицательный знак после данного селектора (!).
Например:
body! a:hover{
background: red;
}
установит красный цвет фона, если пользователь наводится на любой якорь.
Но нам нужно ждать реализации браузеров: (
Пожалуйста, добавьте название собственности, как это.
public class Model : Notifier, IDataErrorInfo
{
private string name;
public string Name
{
get { return name; }
set { name = value; OnPropertyChanged("Name"); }
}
}
Основная проблема реализации 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>)
, которое будет возвращать имя без какого-либо риска опечатки, как в этом примере: