2016-07-22 2 views
2

Новая ВПП (MVVM), это, кажется, типичный способ обработки пользовательских изменений:WPF OnPropertyChanged повторения кода

private bool someProperty= false; 
    public bool SomeProperty 
    { 
     get { return someProperty; } 
     set 
     { 
      if (someProperty!= value) 
      { 
       someProperty= value; 
       OnPropertyChanged(nameof(SomeProperty)); 


      } 
     } 
    } 

Для большого и сложного экрана с большим количеством полей, которые нуждаются в редактировании и обрабатываются сразу (не в конце при нажатии кнопки), это приведет к тонне повторяющегося кода. Кажется, действительно сложно поддерживать, что, если у вас 50 или более свойств? Есть ли лучший способ сделать это?

ответ

0

Техника сохранения жизни здесь заключается в использовании PropertyChanged.Fody, который вводит код INotifyPropertyChanged в свойствах во время компиляции и делает некоторые другие еще более умные вещи.

+0

выглядит хорошо. Как я могу использовать это, чтобы добавить некоторые настраиваемые материалы для определенных свойств? Это означает, что помимо OnPropertyChanged() я хочу выполнить другой код. –

+0

Я думаю, что нашел свой собственный ответ здесь: https://github.com/Fody/PropertyChanged/wiki/On_PropertyName_Changed –

0

Вы можете использовать этот метод:

private void OnPropertyChanged([CallerMemberName] string propertyName = null) 
{ 
    var handler = PropertyChanged; 
    if (handler != null) 
    { 
     handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

И использовать его, как это в каждой собственности:

private bool someProperty= false; 
    public bool SomeProperty 
    { 
     get { return someProperty; } 
     set 
     { 
      if (someProperty!= value) 
      { 
       someProperty= value; 
       OnPropertyChanged(); 
      } 
     } 
    } 
+0

Моя проблема была со всеми 7-10 строками кода, я бы предпочел иметь только 1 или 2 для каждого свойства :) –

+0

@Keith Просто используйте инструмент PropertyChanged.Fody. – mechanic

0

я использую базовый класс для всех моих ViewModels с этими функциями в нем:

protected void RaisePropertyChanged(string propertyName) 
{ 
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
} 

protected bool SetValue<T>(ref T backingField, T newValue, [CallerMemberName] string propertyName = "") 
{ 
    if (EqualityComparer<T>.Default.Equals(backingField, newValue)) 
    { 
     return false; 
    } 
    backingField = newValue; 
    RaisePropertyChanged(propertyName); 
    return true; 
} 

Вы можете использовать его таким образом из любого подкласса:

private string _firstName; 

public string FirstName 
{ 
    get { return _firstName; } 
    set { SetValue(ref _firstName, value); } 
} 

SetValue вернется true, если новое значение отличается от предыдущего значения, и false, если это было то же самое, только в случае, если вам необходимо приковать любые дальнейшие действия для более сложных сеттеров.

Смежные вопросы