2010-05-07 21 views
23

Mentre implemento il pattern MVVM con WPF, sto riscontrando che Resharper mi avvisa spesso che alcune proprietà non vengono mai utilizzate nei miei ViewModels. Il problema è che vengono utilizzati, ma solo dal sistema di associazione dei dati. Qualcun altro ha riscontrato questo fastidio e c'è un modo per aiutare Resharper a rendersi conto che queste proprietà vengono effettivamente utilizzate? Sono contento, almeno, che VS 2010 si renda conto correttamente che i membri con tag [Import] non "saranno sempre nulli", ma spero di poter risolvere anche questo problema.Avvisi del reporter con MVVM

risposta

21

È possibile utilizzare le annotazioni esterne per indicare che il metodo di ricondizionamento è utilizzato e quindi non avvisare. consultare la documentazione ReSharper su quel here

che serve per decorare tali metodi con [UsedImplicitlyAttribute]

Prima di utilizzare l'attributo che si vede:

enter image description here

e poi dopo aver applicato l'attributo:

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

Grazie, questa è un'informazione molto utile. –

+0

C'è anche un modo per applicare questo attributo a tutti i membri di, ad esempio, un'interfaccia? Ho provato l'ImplicituseTargetFlags, ma non ha avuto successo. – Matthias

+0

@ Matthias Koch questo funziona per me usando 'ImplicitUseTargetFlags.WithMembers' - per favore vedi la mia risposta aggiornata sopra dove ho fornito gli screenshot. – wal

2

Una soluzione greggio potrebbe essere quella di disattivare l'avviso del tutto:

Sotto ReSharper> Opzioni> Code Inspection> Inspection Gravità, impostare il livello di avviso per questa voce su "Non mostrare".

Questo ovviamente non è l'ideale, ma dipende dal livello di fastidio con i falsi positivi.

4

È possibile provare due diverse opzioni. Uno è quello di ridurre la severità dell'ispezione del Resharper su "Suggerimento". L'altra opzione è quella di utilizzare l'elemento "Sopprimi l'ispezione con commento". Il programma di ricerca fornisce le proprietà che generano l'avviso che si sa che vengono utilizzate. Personalmente, andrei con la riduzione della gravità a "Suggerimento".

+1

Ridurre il livello di gravità in Hint funziona abbastanza bene per ora. Mi dava fastidio vedere linee arancioni irrisolte alla destra delle mie lezioni. –

0

Le proprietà sono pubbliche o interne? Nella mia esperienza, ReSharper non mette in guardia sul pubblico (poiché non è in alcun modo possibile che i membri non vengano utilizzati esternamente) ma avviserà i membri interni poiché possono essere utilizzati solo all'interno di tale assembly (InternalsVisibleTo nonostante)

+0

Sono pubblici e sono stato in grado di modificare le impostazioni in Hint solo per le proprietà pubbliche. Verrà comunque visualizzato un avviso per proprietà private/interne, che va bene. L'avviso viene visualizzato nel contesto dell'analisi a livello di soluzione poiché "l'accesso automatico della proprietà implementato non viene mai utilizzato". –

13

Utilizzare

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

It 'stick's View to Model. In View è possibile visualizzare le proprietà del modello e viceversa - nelle proprietà del modello deve essere utilizzato.

+0

Ciò non aiuta quando il modello di vista è associato automaticamente alla vista tramite l'attributo x: Name come in molti framework MVVM. – Nathan

+2

Questa sembra la soluzione migliore per me. –

2

Questo a causa della natura debolmente tipizzata dei binding XAML.

Per rendere ReSharper in grado di risolvere le proprietà della VM che si utilizza dalla vista XAML, è necessario introdurre annotazioni del tipo di contesto dei dati per {Binding} s nel markup. Vedere la sezione "Assistenza di rilegatura" in this blog post per i dettagli. Otterrai il corretto supporto per l'analisi, la navigazione e il refactoring quando ReSharper conoscerà il tipo di contesto dati.

ReSharper sa anche modalità circa OneWay/OneWayToSource/TwoWay attacchi e segna proprietà getter/setter/entrambi di accesso usati rispettivamente.