MVVM-RaisePropertyChanged превращая код в беспорядок

новый для MVVM поэтому, пожалуйста, извините мое невежество.

Я думаю, что использую его правильно, но я нахожу, что моя ViewModel имеет слишком много из них:

RaisePropertyChanged("SomeProperty")

каждый раз, когда я устанавливаю свойство, я должен поднять это проклятое свойство.

Я скучаю по дням, когда я мог просто пойти:

public int SomeInteger { get; private set;}

в эти дни я должен придерживаться "RaisePropertyChanged" везде или мой пользовательский интерфейс не отражает изменения : (

Я делаю это неправильно или другие люди раздражается чрезмерным количеством магических струн и сеттеров старой школы?

должен ли я использовать свойства зависимостей вместо этого? (Я сомневаюсь, что это поможет коду раздуваться в любом случае)

несмотря на эти проблемы, я все еще думаю, что MVVM-это путь, поэтому я думаю, что это что-то.

5 ответов


взгляните на это какое лучшее или самое интересное использование методов расширения вы видели?.

он описывает метод расширения и вспомогательный метод, который мои классы Model и ViewModel используют для включения следующих строго типизированных свойств (без волшебной строки).

private string _name;
public string Name
{
    get { return _name; }
    set { this.NotifySetProperty(ref _name, value, () => this.Name); }
}

Это примерно так же просто, как я думаю, что это можно сделать. Надеюсь, это поможет.


вы можете использовать атрибут NotifyPropertyChanged PostSharp. Тогда все, что вам нужно сделать, это поместить атрибут в класс, и все. Например:

[NotifyPropertyChanged]
public class MyClass 
{
    public string MyProperty { get; set; }
}

Это помогает взглянуть на вещи с другой точки зрения: это не сложные свойства .NET, а упрощенные свойства зависимостей.

связываемые свойства модели представления в WPF не идентичны свойствам .NET, вместо этого это своего рода хранилище ключей. Если вы хотите легкую альтернативу DependencyObject, у вас есть возможность реализовать этот магазин ключей-значений просто купить вызов определенной функции в сеттерах - неплохо, на самом деле. Конечно, далеко не идеал, но ваша точка зрения безусловно несправедливо.


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

метод расширения просто выглядит следующим образом:

public static string GetPropertyName(this MethodBase methodBase)
{
    return methodBase.Name.Substring(4);
}

при этом это означает, что наборы свойств устойчивы к изменениям имен и выглядят следующим образом:

private string _name;
public string Name
{
    get { return _name; }
    set 
    {
            name = value;
            RaisePropertyChanged(MethodBase.GetCurrentMethod().GetPropertyName()); 
    }
}

Я написал больше об этом метод расширения здесь а у меня опубликован соответствующий фрагмент кода здесь.


Это поможет: "вид магии" Без Усилий INotifyPropertyChanged

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

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

[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; } 
  ..... 
}