MVVM CallerMemberName и "волшебные струны"

В новом выпуске C# 5.0 появилось что-то, чтобы избавиться от "волшебных строк" ​​в реализации INotifyPropertyChanged, например:

OnPropertyChanged("CustomerName");

Теперь можно написать просто:

OnPropertyChanged();

Это возможно благодаря CallerMemberName в определении метода:

protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
{ ... }

Это гораздо более дружественно к рефакторингу, чем "волшебные строки" и быстрее, чем лямбда-выражения, но мне интересно, как мы можем несколько раз вызывать OnPropertyChanged с одного набора доступа. Например, если мы хотели что-то вроде этого:

public int Width
{
    get
    {
        return width;
    }
    set
    {
        width = value;
        OnPropertyChanged("Width");
        OnPropertyChanged("Height");
    }
}

Как мы можем сделать это способом CallerMemberName и избежать использования "магических строк" ​​и лямбда-выражений?

Мне также интересно, как мы можем избежать использования "волшебных строк" в информации IDataError:

public string Error
        {
            get;
            private set;
        }

        public string this[string columnName]
        {
            get
            {
                if (columnName == "Name")
                {
                    if (String.IsNullOrWhiteSpace(Name))
                        Error = "Name cannot be null or empty.";
                    else
                        Error = null;
                }

                return Error;
            }
        }

Я новичок в MVVM, поэтому, возможно, я упустил какой-то умный способ справиться с "волшебными струнами", однако я провел некоторое исследование и ничего не нашел.

3 ответа

Решение

Ответ прост: вы не можете этого сделать. Как имя CallerMemberName указывает, что он будет содержать имя звонящего.
Для случаев, когда вы хотите поднять PropertyChanged для другого, чем текущий, вам придется использовать один из "старых" способов.

В IDataErrorInfo Вы также должны использовать один из этих способов, альтернативы нет.

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

Это поможет: "Kind Of Magic" без усилий INotifyPropertyChanged

http://visualstudiogallery.msdn.microsoft.com/d5cd6aa1-57a5-4aaa-a2be-969c6db7f88a

в качестве примера для добавления его к одному свойству:

[Magic] 
public string Name { get { return _name; } set { _name = value; } } 
string _name;

Еще один пример добавления его ко всем свойствам класса:

[Magic] 
public class MyViewModel: INotifyPropertyChanged 
{ 
  public string Name { get; set; } 
  public string LastName { get; set; } 
  ..... 
}
Другие вопросы по тегам