Почему RecyclerView не имеет onItemClickListener ()? [закрыто]

IMHO, подход PostSharp, как и в принятом ответе, очень приятный и, конечно же, прямой ответ на заданный вопрос.

Однако для тех, кто не может или не будет использовать такой инструмент, как PostSharp для расширения синтаксиса языка C #, можно получить большую выгоду, чтобы избежать повторения кода с базовым классом, который реализует INotifyPropertyChanged. Есть много примеров, лежащих вокруг, но никто до сих пор не был включен в этот полезный и хорошо подверженный торговле вопрос, так что вот версия, которую я обычно использую:

/// <summary>
/// Base class for classes that need to implement <see cref="INotifyPropertyChanged"/>
/// </summary>
public class NotifyPropertyChangedBase : INotifyPropertyChanged
{
    /// <summary>
    /// Raised when a property value changes
    /// </summary>
    public event PropertyChangedEventHandler PropertyChanged;

    /// <summary>
    /// Updates a field for a named property
    /// </summary>
    /// <typeparam name="T">The type of the field</typeparam>
    /// <param name="field">The field itself, passed by-reference</param>
    /// <param name="newValue">The new value for the field</param>
    /// <param name="propertyName">The name of the associated property</param>
    protected void UpdatePropertyField<T>(ref T field, T newValue, [CallerMemberName] string propertyName = null)
    {
        if (!EqualityComparer<T>.Default.Equals(field, newValue))
        {
            field = newValue;
            OnPropertyChanged(propertyName);
        }
    }

    /// <summary>
    /// Raises the <see cref="PropertyChanged"/> event.
    /// </summary>
    /// <param name="propertyName">The name of the property that has been changed</param>
    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.DynamicInvoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

Используется, например, так:

private int _value;
public int Value
{
    get { return _value; }
    set { UpdatePropertyField(ref _value, value); }
}

Не так лаконично, как просто применить атрибут кода к автоматически реализованному свойству, как в подходе PostSharp, но все же имеет большое значение для ускорения реализации моделей представления и других аналогичные типы.

Ключевые особенности выше, отличающие его от некоторых других реализаций:

  1. . Равенство сравнивается с использованием EqualityComparer<T>.Default. Это гарантирует, что типы значений могут сравниваться без коробки (общей альтернативой будет object.Equals(object, object)). Экземпляр IEqualityComparer<T> кэшируется, поэтому после первого сравнения для любого заданного типа T он очень эффективен.
  2. Метод OnPropertyChanged() - virtual. Это позволяет производным типам легко и эффективно обрабатывать события с измененными свойствами централизованно, без необходимости подписываться на событие PropertyChanged (например, для нескольких уровней наследования), а также, конечно, дает производному типу лучший контроль над тем, как и когда он обрабатывает событие измененного свойства относительно повышения фактического события PropertyChanged.
921
задан Tarun Varshney 8 June 2017 в 09:14
поделиться