2010-05-07 18 views
23

Al implementar el patrón MVVM con WPF, estoy descubriendo que Resharper a menudo me advierte que ciertas propiedades nunca se usan en mis ViewModels. El problema es que están siendo utilizados, pero solo por el sistema de enlace de datos. ¿Alguien más ha encontrado esta molestia y hay alguna manera de ayudar a Resharper a darse cuenta de que estas propiedades están, de hecho, siendo utilizadas? Me alegro, al menos, de que VS 2010 se dé cuenta de que los miembros etiquetados [Importar] no "siempre serán nulos", pero espero que pueda solucionar este problema también.Advertencias de Resharper con MVVM

Respuesta

21

Puede usar anotaciones externas para indicar a Resharper que se usa el método y, por lo tanto, no advertirle. ver los documentos ReSharper en ese here

lo necesario para decorar cualquiera de estos métodos con [UsedImplicitlyAttribute]

Antes de utilizar el atributo que se ve:

enter image description here

y luego después de aplicar el atributo:

[UsedImplicitly(ImplicitUseTargetFlags.WithMembers)] 
class NotUsed 
{ 
    public int Field1 { get; set; } 
    public int Field2 { get; set; } 
} 
+0

Gracias, esta es información muy útil. –

+0

¿Existe también una forma de aplicar este atributo a todos los miembros de, por ejemplo, una interfaz? Probé el ImplicituseTargetFlags, pero no tuve éxito. – Matthias

+0

@ Matthias Koch esto funciona para mí usando 'ImplicitUseTargetFlags.WithMembers' - vea mi respuesta actualizada arriba donde proporcioné capturas de pantalla. – wal

2

Una solución cruda sería desactivar el aviso completo:

Bajo ReSharper> Opciones> Código de Inspección> Inspección Gravedad, establecer el nivel de advertencia para este elemento en "No mostrar".

Esto obviamente no es ideal, pero depende de su nivel de molestia con los falsos positivos.

4

Puede probar dos opciones diferentes. Una es reducir la severidad de la inspección de Resharper a "Sugerencia". La otra opción es usar el elemento "Suprimir inspección con comentario" Resharper proporciona las propiedades que generan la advertencia que usted sabe que se están utilizando. Personalmente, me gustaría reducir la gravedad a "Sugerencia".

+1

Reducir la gravedad a Sugerencia funciona bastante bien por ahora. Me molestaba ver líneas anaranjadas sin resolver a la derecha de mis clases. –

0

¿Las propiedades son públicas o internas? En mi experiencia, ReSharper no advierte sobre lo público (ya que no hay forma de que pueda decir que los miembros no están siendo utilizados externamente) pero advertirá a los miembros internos ya que solo se pueden usar dentro de ese ensamblaje (InternalsVisibleTo)

+0

Son públicos y pude cambiar la configuración a Sugerencia solo para propiedades públicas. Todavía veré una advertencia para propiedades privadas/internas, lo cual está bien. La advertencia se muestra en el contexto del análisis en toda la Solución, ya que "nunca se utiliza el acceso de propiedad implementado automáticamente". –

13

Uso

<UserControl 
... 
xmlns:vm="clr-namespace:YourProject.ViewModels" mc:Ignorable="d" 
d:DataContext="{d:DesignInstance vm:SomeClassViewModel}"> 

Es la visión del modelo. En Vista, puede ver las propiedades del modelo y viceversa, en las propiedades del modelo se debe utilizar.

+0

Esto no ayuda cuando el modelo de vista está vinculado a la vista de forma automática mediante el atributo x: Name como en muchos marcos de MVVM. – Nathan

+2

Esta parece ser la mejor solución para mí. –

2

Esto se debe a la naturaleza débilmente tipada de los enlaces XAML.

Para que ReSharper pueda resolver qué propiedades de la VM utiliza desde la vista XAML, debe introducir anotaciones de tipo de contexto de datos para {Binding} s en el marcado. Consulte la sección "Asistencia de enlace" en this blog post para obtener más detalles. Obtendrá soporte de análisis de uso correcto, navegación y refactorizaciones cuando ReSharper conozca el tipo de contexto de datos.

ReSharper también sabe acerca de los modos OneWay/OneWayToSource/TwoWay atascamientos y marca propiedades getters/setters/ambos descriptores de acceso y usadas respectivamente.