Domanda

Sono un po 'confuso nel creare un DependencyProperty per proprietà che dipendono da fonti esterne. Ad esempio, in un'applicazione a ultrasuoni che sto scrivendo, al momento ho il seguente in un wrapper C ++ gestito (tradotto in C # per semplicità qui, implementando INotifyPropertyChanged):

public int Gain
{
    get { return ultrasound.GetParam(prmGain); }
    set 
    { 
        ultrasound.SetParam(prmGain, value);
        NotifyPropertyChanged("Gain");
    }
}

Tutto il mio codice è usato in WPF, e stavo considerando come sarebbe accaduto cambiare il INotifyPropertyChanged in DependencyProperty , e se beneficiassi delle modifiche. Esistono circa 30 variabili simili a questa, la maggior parte delle quali diventa databound su un dispositivo di scorrimento, un blocco di testo o un altro controllo sullo schermo.

Sarebbe corretto quanto segue per l'implementazione di un DependencyProperty per questo oggetto?

public int Gain
{
    get { return ultrasound.GetParam(prmGain); }
    set 
    { 
        ultrasound.SetParam(prmGain, value);
        this.SetValue(GainProperty, value); 
    }
}

public static readonly DependencyProperty GainProperty = DependencyProperty.Register(
    "Gain", typeof(int), typeof(MyUltrasoundWrapper), new PropertyMetadata(0));

Non ho mai visto un esempio in cui this.GetValue (GainProperty) non è stato utilizzato. Inoltre, ci sono altre funzioni che possono modificare il valore. Anche questo sarebbe il cambiamento corretto?

public void LoadSettingsFile(string fileName)
{
    // Load settings...

    // Gain will have changed after new settings are loaded.
    this.SetValue(GainProperty, this.Gain);
    // Used to be NotifyPropertyChanged("Gain");
}

Inoltre, in una nota a margine, dovrei aspettarmi un aumento delle prestazioni nei casi in cui la maggior parte delle proprietà sono databound, o meglio, una perdita di prestazioni nei casi in cui molti parametri NON sono databound?

È stato utile?

Soluzione

Quando si utilizza una proprietà di dipendenza, i metodi Get e Set devono essere semplicemente wrapper per this.GetValue () e this.SetValue (), la ragione di ciò è che WPF non utilizza i getter o setter per accedere al valore, quindi non puoi dipendere dal codice aggiuntivo in esecuzione tutto il tempo.

Se hai bisogno di queste proprietà come proprietà di dipendenza, crea una proprietà di dipendenza standard che memorizza efficacemente nella cache il risultato ultrasound.GetParam (prmGain) e chiama ultrasound.SetParam (prmGain, value) all'interno dell'evento PropertyChanged che verrà chiamato in modo affidabile no importa come viene modificata la proprietà.


Mentre ciò che ho scritto sopra è ancora corretto, rileggere la tua domanda mi fa pensare che potresti fraintendere quale sia una proprietà di dipendenza. Se questo oggetto wrapper C ++ è effettivamente il tuo modello, allora vuoi rimanere con INotifyPropertyChanged. Le proprietà di dipendenza sono progettate per essere utilizzate internamente da un controllo WPF per facilitare l'associazione e ridurre il footprint di memoria del controllo. Non dovrebbero essere utilizzati all'interno del fornitore di dati, ecco a cosa servono le interfacce di notifica.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top