2010-03-31 12 views
9

Nuovo in MVVM quindi scusate la mia ignoranza.MVVM - RaisePropertyChanged trasformando il codice in un pasticcio

Penso che sto usando nel modo giusto ma io trovare il mio ViewModel ha troppi di questi:

RaisePropertyChanged("SomeProperty") 

Ogni volta che ho impostato una proprietà devo alzare quella proprietà dannato cambiato.

mi mancano i giorni in cui ho potuto solo andare:

public int SomeInteger { get; private set;} 

In questi giorni devo attaccare il "RaisePropertyChanged" in tutto il mondo o il mio UI non riflette i cambiamenti :(

sto facendo è sbagliato o ci sono altre persone che si infastidiscono con il numero eccessivo di corde magiche e vecchi setter della scuola?

Dovrei usare invece le proprietà di dipendenza? (dubito che aiuterebbe comunque il codice a gonfiarsi)

Nonostante questi problemi, penso ancora che MVVM sia la strada da percorrere quindi immagino che sia qualcosa.

+1

"Mi mancano i giorni in cui potevo andare", come facilmente dimentichiamo, in C# 2 non potevi farlo affatto. ;) – AnthonyWJones

+0

ya Immagino di essermi rovinato, ma nonostante i progressi compiuti, penso ancora che ci potrebbe essere un modo più pulito per implementare questa roba. Non conosco abbastanza i meccanismi interni/compromessi ... – vidalsasoon

risposta

12

Dai un'occhiata a questo What is the best or most interesting use of Extension Methods you've seen?.

Descrive un metodo di estensione e un metodo di supporto che le mie classi Model e ViewModel utilizzano per abilitare le seguenti proprietà fortemente tipizzate (nessuna stringa magica).

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

Questo è più semplice che penso possa ottenere. Spero che sia d'aiuto.

+0

Grazie. sono felice di sapere che non ero l'unico ad avere problemi. – vidalsasoon

4

Aiuta a guardare le cose da una prospettiva diversa: quelle non sono proprietà .NET complicate, ma proprietà di dipendenza semplificate.

Le proprietà legabili di un modello di visualizzazione in WPF non sono identiche alle proprietà .NET, ma è un tipo di archivio di valori-chiave. Se si desidera un'alternativa leggera a DependencyObject, si ha la possibilità di implementare questo negozio con valore-chiave semplicemente acquistando determinate funzioni nei setter - non male, in realtà. Lontano dall'ideale, certo, ma il tuo punto di vista è certamente ingiusto.

8

È possibile utilizzare l'attributo NotifyPropertyChanged di PostSharp. Quindi tutto quello che devi fare è mettere un attributo nella classe e basta. Es .:

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

interessante! curioso del sovraccarico però ... – vidalsasoon

+3

Non c'è nessun sovraccarico di runtime dal momento che PostSharp semplicemente modifica la classe compilata e inietta esattamente lo stesso codice che scrivi manualmente. C'è un tempo di costruzione ridotto, ma l'ho trovato trascurabile. –

+0

L'unico inconveniente di questo approccio è che a volte è necessario RaisePropertyChanged per una proprietà diversa da quella in cui viene richiamato il setter. – Random

0

non ottiene di nuovo al codice pulito, ma io uso un metodo semplice estensione per ottenere il nome di proprietà per evitare problemi con le stringhe di magia. Mantiene anche la leggibilità del codice, cioè è esplicito ciò che sta accadendo.

Il metodo di estensione è semplicemente come segue:

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

Con questo significa che è proprietà imposta sono resistenti contro cambiamenti di nome e simile al seguente:

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

ho scritto più su questo extension method here e ho published a matching code snippet here.

+0

Vecchia domanda, lo so :) Un altro modo è incapsulare il RaisePropertyChanged all'interno di una classe base e utilizzare la seguente firma del metodo: OnRaisePropertyChanged ([CallerMemberName] propertyName = ""). In questo modo è possibile chiamare il metodo senza dover scrivere il nome della proprietà –

0

Ciò contribuirà a: "Kind Of Magic" sforzo INotifyPropertyChanged

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

come esempio per l'aggiunta a una proprietà:

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

altro esempio per l'aggiunta a tutte le proprietà di classe:

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