2010-05-07 5 views
23

Lorsque j'implémente le modèle MVVM avec WPF, je constate que Resharper m'avertit souvent que certaines propriétés ne sont jamais utilisées dans mes ViewModels. Le problème est qu'ils sont utilisés, mais seulement par le système de liaison de données. Quelqu'un d'autre a-t-il rencontré cette gêne et y a-t-il un moyen d'aider Resharper à se rendre compte que ces propriétés sont effectivement utilisées? Je suis heureux, au moins, que VS 2010 réalise correctement que les membres marqués [Import] ne seront pas "toujours nuls", mais j'espère pouvoir résoudre ce problème aussi.Avertissements de Resharper avec MVVM

Répondre

21

Vous pouvez utiliser les annotations externes pour indiquer à Resharper que la méthode est utilisée et ne pas vous avertir. voir les ReSharper docs sur ce here

Vous devez décorer toutes ces méthodes avec [UsedImplicitlyAttribute]

Avant d'utiliser l'attribut que vous voyez:

enter image description here

puis après l'application de l'attribut:

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

Merci, c'est une information très utile. –

+0

Existe-t-il également un moyen d'appliquer cet attribut à tous les membres, par exemple, d'une interface? J'ai essayé le ImplicituseTargetFlags, mais n'ai pas réussi. – Matthias

+0

@ Matthias Koch cela fonctionne pour moi en utilisant 'ImplicitUseTargetFlags.WithMembers' - s'il vous plaît voir ma réponse mise à jour ci-dessus où j'ai fourni des captures d'écran. – wal

2

Une solution brute serait de désactiver l'avertissement tout à fait:

Sous ReSharper> Options> Code de l'inspection> Inspection de gravité, réglez le niveau d'alerte pour cet article à « Ne pas afficher ».

Ce n'est évidemment pas idéal, mais cela dépend de votre niveau d'agacement avec les faux positifs.

4

Vous pouvez essayer deux options différentes. L'une consiste à réduire la gravité de l'inspection Resharper à "Hint". L'autre option consiste à utiliser l'option «Supprimer l'inspection avec commentaire». Resharper fournit les propriétés qui génèrent l'avertissement que vous savez être utilisé. Personnellement, j'irais avec la réduction de la gravité de "Hint".

+1

Réduire la gravité à Hint fonctionne assez bien pour l'instant. Cela me dérangeait de voir des lignes orange non résolues à droite de mes cours. –

0

Les propriétés sont-elles publiques ou internes? Dans mon expérience, ReSharper ne prévient pas sur pubic (puisqu'il est impossible de dire que les membres ne sont pas utilisés en externe) mais il avertira les membres internes puisqu'ils ne peuvent être utilisés que dans cet assembly (InternalsVisibleTo nonobstant)

+0

Ils sont publics et j'ai été en mesure de modifier les paramètres à Indice pour les propriétés publiques seulement. Je vais toujours voir un avertissement pour les propriétés privées/internes, ce qui est bien. L'avertissement apparaît dans le contexte de l'analyse à l'échelle de la solution, car «l'accesseur de propriété implémenté automatiquement n'est jamais utilisé». –

13

Utilisez

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

Il est bâton Voir au modèle. Dans la vue, vous pouvez voir les propriétés du modèle et vice versa. Dans les propriétés du modèle, vous devez utiliser.

+0

Cela n'aide pas lorsque le modèle de vue est automatiquement lié à la vue via l'attribut x: Name, comme dans de nombreux frameworks MVVM. – Nathan

+2

Cela semble la meilleure solution pour moi. –

2

Cela est dû à la nature faiblement typée des liaisons XAML.

Pour permettre à ReSharper de résoudre les propriétés de machine virtuelle que vous utilisez depuis la vue XAML, vous devez introduire des annotations de type de contexte de données pour {Binding} s dans le balisage. Reportez-vous à la section "Assistance de liaison" au this blog post pour plus de détails. Vous obtiendrez une prise en charge correcte de l'analyse de l'utilisation, de la navigation et des refactorings lorsque ReSharper connaîtra le type de contexte de données.

ReSharper connaît aussi OneWay/OneWayToSource/TwoWay Fixations modes et marques propriétés getters/setters/deux accesseurs tel qu'il est utilisé respectivement.