2009-10-02 9 views
5

Sto cercando di legare il mio titolo della finestra a una proprietà nel mio modello vista, in questo modo:WPF - vincolanti titolo della finestra di dati per visualizzare le proprietà del modello

Title="{Binding WindowTitle}" 

La proprietà si presenta così:

/// <summary> 
    /// The window title (based on profile name) 
    /// </summary> 
    public string WindowTitle 
    { 
     get { return CurrentProfileName + " - Backup"; } 
    } 

La proprietà CurrentProfileName è derivata da un'altra proprietà (CurrentProfilePath) impostata quando qualcuno apre o salva il profilo. All'avvio iniziale, il titolo della finestra è impostato correttamente, ma ogni volta che la proprietà CurrentProfilePath cambia, la modifica non viene visualizzata nel titolo della finestra come previsto.

Non penso di poter utilizzare una proprietà di dipendenza qui perché la proprietà è una derivata. La proprietà di base da cui è derivata è una proprietà di dipendenza, ma ciò non sembra avere alcun effetto.

Come è possibile rendere l'aggiornamento automatico del titolo del modulo basato su questa proprietà?

risposta

9

Questo perché WPF non ha modo di sapere che WindowTitle dipende da CurrentProfileName. La classe deve attuare INotifyPropertyChanged, e quando si modifica il valore di CurrentProfileName, è necessario per generare l'evento PropertyChanged per CurrentProfileNameeWindowTitle

private string _currentProfileName; 
public string CurrentProfileName 
{ 
    get { return __currentProfileName; } 
    set 
    { 
     _currentProfileName = value; 
     OnPropertyChanged("CurrentProfileName"); 
     OnPropertyChanged("WindowTitle"); 
    } 
} 

UPDATE

Ecco una tipica implementazione di INotifyPropertyChanged :

public class MyClass : INotifyPropertyChanged 
{ 
    // The event declared in the interface 
    public event PropertyChangedEventHandler PropertyChanged; 

    // Helper method to raise the event 
    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
      handler(this, new PropertyChangedEventArgs(propertyName); 
    } 

    ... 
} 
+0

Bingo. Questo è stato. Domanda secondaria: il metodo OnPropertyChanged esistente ha accettato solo un oggetto DependencyProperty: è davvero necessario aggiungere l'effettivo evento PropertyChanged e un metodo personalizzato OnPropertyChanged alla mia classe o esiste un modo più semplice? – Chris

+0

Sì, è necessario dichiarare l'evento. Il metodo esistente 'OnPropertyChanged' è ereditato da' DependencyObject' ed è solo per le proprietà di dipendenza. –

+0

Vedere la mia risposta aggiornata per un esempio di codice –

Problemi correlati