Какое зло из двух меньшее? - C#
Формулировка задачи:
Меня всегда раздражал практически идентичный код в некоторых местах кода. Но порой проще смирится с этим, ведь решение обойдется дороже , возможно, в плане производительности, и количестве работы. Такая вот дрянь и в паттерне MVVM. Если есть любая не OneTime или OneWayToSource привязка, то должен быть реализован интерфейс INotify... даже и писать полное имя не хочется. В каждом прибиндиваемом свойстве обязательно будет однотипный код, вроде проверки не было ли это значение, что и до, обязательный вызов события с поверкой на null, в лучше случае для этой однотипной работы будет создан абстрактный класс с объявленными событиями и методом OnPropertyChanged.
Решить эту проблему трудно. Можно сделать с помощью рефлексии, но медленно, да и прописывать все время в придачу к свойству nameof тоже утомляет. Можно последовать способу обертывания, что я и решил попробовать сделать.
Обертка :Допустим, примитивная viewmodel:Но все равно нужно будет все время писать Property.Value!!! Хоть застрелись опять повторяющийся код.
Можно еще написать расширение разметки, чтобы в xaml не писать все время.Value
Вот и как это разрешить, и что лучше
public abstract class TypeShell : PropertyChangedNotifer, INotifyPropertyChanging { public event PropertyChangingEventHandler PropertyChanging; protected object IncapsulatePropertyValue; protected TypeShell(object incapsulatePropertyValue) => IncapsulatePropertyValue = incapsulatePropertyValue; protected void OnPropertyChanging(string propertyName) => PropertyChanging?.Invoke(this, new PropertyChangingEventArgs(propertyName)); } public class TypeShell: TypeShell { public T Value { get => (T) IncapsulatePropertyValue; set { if (Equals(value, IncapsulatePropertyValue)) return; OnPropertyChanging(nameof(Value)); IncapsulatePropertyValue = value; OnPropertyChanged(nameof(Value)); } } private TypeShell(T value) : base(value) { } public static implicit operator TypeShell (T value) => new TypeShell (value); public static implicit operator T(TypeShell value) => (T) value.IncapsulatePropertyValue; }
public class SmartViewModel { public TypeShellName { get; } = "My name is fiddooor"; public SmartViewModel() { Task.Factory.StartNew(() => { Thread.Sleep(3000); Name.Value = "!"; }); } }
Решение задачи: «Какое зло из двух меньшее?»
textual
Листинг программы
public abstract class NotifyPropertyChangedViewModel : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; protected virtual void NotifyPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } protected void SetField<T>(ref T field, T value, [CallerMemberName] string propertyName = null) { if (!EqualityComparer<T>.Default.Equals(field, value)) { field = value; NotifyPropertyChanged(propertyName); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д