2010-03-31 10 views
9

Nuevo en MVVM así que disculpe mi ignorancia.MVVM - RaisePropertyChanged convirtiendo el código en un desastre

Creo que estoy usando bien pero me parece que mi modelo de vista tiene muchos de estos:

RaisePropertyChanged("SomeProperty") 

Cada vez que establece una propiedad que tengo que plantear que la propiedad ha cambiado condenados.

echo de menos los días en los que sólo podía ir:

public int SomeInteger { get; private set;} 

En estos días tengo que pegar la "RaisePropertyChanged" en todas partes o de mi interfaz de usuario no refleja los cambios :(

estoy haciendo ¿Está mal o hay otras personas que se molestan con el número excesivo de cadenas mágicas y establecedores de propiedades de la vieja escuela?

¿Debo estar usando propiedades de dependencia? (dudo que eso ayude al código a aumentar)

A pesar de estos problemas, todavía creo que MVVM es el camino a seguir, así que supongo que es algo.

+1

"Extraño los días en los que podría ir" lo fácil que lo olvidamos, en C# 2 no se podía hacer eso. ;) – AnthonyWJones

+0

ya supongo que me he echado a perder, pero a pesar del progreso que se está logrando, todavía creo que podría haber una forma más limpia de implementar esto. No sé lo suficiente sobre el funcionamiento interno/intercambios ... – vidalsasoon

Respuesta

12

Echa un vistazo a este What is the best or most interesting use of Extension Methods you've seen?.

Describe un método de extensión y un método de ayuda que mis clases Model y ViewModel usan para habilitar las siguientes propiedades fuertemente tipadas (sin cadena mágica).

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

Esto es casi tan simple como creo que puede obtener. Espero eso ayude.

+0

Gracias. un poco feliz de saber que no era el único que tenía problemas. – vidalsasoon

4

Ayuda a ver las cosas desde una perspectiva diferente: esas no son propiedades .NET complicadas, sino propiedades de dependencia simplificadas.

Las propiedades vinculables de un modelo de vista en WPF no son idénticas a las propiedades .NET, sino que es una especie de almacén de clave-valor. Si desea una alternativa ligera a DependencyObject, tiene la capacidad de implementar este almacén de clave-valor simplemente compre llamar a ciertas funciones en setters, lo cual no está nada mal. Lejos de ser ideal también, por supuesto, pero su punto de vista es ciertamente injusto.

8

Podría usar el atributo NotifyPropertyChanged de PostSharp. Entonces todo lo que tienes que hacer es poner un atributo en la clase y eso es todo. Ej .:

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

¡muy interesante! Sin embargo, curioso acerca de la sobrecarga ... – vidalsasoon

+3

No hay sobrecarga de tiempo de ejecución ya que PostSharp simplemente modifica la clase compilada e inyecta exactamente el mismo código que usted escribe manualmente. Hay un pequeño tiempo de construcción, pero lo encontré insignificante. –

+0

El único inconveniente de este enfoque es que a veces es necesario RaisePropertyChanged para una propiedad distinta de la que se está invocando al setter. – Random

0

que no recibe de nuevo al código limpio, pero yo uso un método simple extensión para obtener el nombre de la propiedad para evitar problemas con las cuerdas mágicas. También mantiene la legibilidad del código, es decir, es explícito lo que está sucediendo.

El método de extensión es simplemente de la siguiente manera:

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

Con esto se quiere decir que los conjuntos de propiedades son resistentes frente a los cambios de nombre y tener el aspecto siguiente:

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

He escrito más acerca de este extension method here y tengo published a matching code snippet here.

+0

Pregunta anterior, sé :) Otra forma es encapsular RaisePropertyChanged dentro de una clase base y usar la siguiente firma de método: OnRaisePropertyChanged ([CallerMemberName] propertyName = ""). De esta forma puede llamar al método sin necesidad de escribir el nombre de la propiedad –

0

Esto ayudará a: "Kind of Magic" esfuerzo INotifyPropertyChanged

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

como un ejemplo para agregarlo a una propiedad:

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

Otro ejemplo para agregarlo a todas las propiedades de clase:

[Magic] 
public class MyViewModel: INotifyPropertyChanged 
{ 
    public string Name { get; set; } 
    public string LastName { get; set; } 
    ..... 
} 
Cuestiones relacionadas