2013-10-02 13 views
8

Desidero ascoltare le modifiche di DependencyProperty. Questo codice funziona, ma dopo ogni ricaricare la pagina con il CustomControl è metodo di callback chiamato più volte ...Proprietà di dipendenza modificata callback - attivazione multipla

public partial class CustomControl : UserControl 
{ 
    public CustomControl() 
    { 
     InitializeComponent(); 
    } 

    public bool IsOpen 
    { 
     get { return (bool)GetValue(IsOpenProperty); } 
     set { SetValue(IsOpenProperty, value); } 
    } 

    public static readonly DependencyProperty IsOpenProperty = 
     DependencyProperty.Register("IsOpen", typeof(bool), typeof(CustomControl), new PropertyMetadata(IsOpenPropertyChangedCallback)); 

    private static void IsOpenPropertyChangedCallback(DependencyObject sender, DependencyPropertyChangedEventArgs e) 
    { 
     Debug.WriteLine("Fire!"); 
    } 
} 

Aggiornamento

ViewModel

private bool _isOpen; 
public bool IsOpen 
{ 
    get { return this._isOpen; } 
    set { this.Set(() => this.IsOpen, ref this._isOpen, value); } // MVVM Light Toolkit 
} 

View

<local:CustomControl IsOpen="{Binding Path=IsOpen}" /> 

Esempio

  • project

    1. tap "seconda pagina"
    2. tap "vero" (cerca nella finestra di output)
    3. tornare
    4. tap "seconda pagina"
    5. tocca "falso" (guarda la finestra di output)
+0

Dove è XAML? Hai legature sulla proprietà? –

+0

Ho aggiunto ulteriori informazioni. –

risposta

3

Questo ha risolto il mio problema.

this.Unloaded += CustomControlUnloaded; 

private void CustomControlUnloaded(object sender, RoutedEventArgs e) 
{ 
    this.ClearValue(CustomControl.IsOpenProperty); 
} 
+0

più 1 per l'idea. Stavo cercando qualcosa che mi stesse mangiando la memoria. risolto facendo questo. –

1

Sembra che il numero di volte in cui l'evento è attivato si riferisce al numero di volte in cui si apre la pagina con il controllo su di esso. Ciò suggerirebbe di avere più istanze della pagina.

Il problema è quindi che le tue pagine stanno facendo qualcosa che impedisce loro di essere distrutti correttamente.
Sfortunatamente, senza essere in grado di vedere il codice è impossibile dire che cosa sta causando questo. È probabile che tu abbia sottoscritto un evento in codice e non ti sia stato annullato l'abbonamento. (Lo vedo molto nelle app telefoniche.)

+0

Questo è sicuramente plausibile. Mi è capitato una o due volte e l'ho seguito per non rimuovere un gestore di eventi quando avrei dovuto. –

0

Quello che succede è che il SecondPageView viene caricato più volte. Ogni volta che viene creata una nuova istanza, essa si collega al contesto dei dati e recupera il valore di IsOpen dal modello di visualizzazione. Quindi viene impostata la proprietà di dipendenza.

Questo è in realtà il comportamento desiderato. Se le proprietà non sono state nuovamente impostate, lo stato del modello di vista non si rifletterebbe nella pagina. Non è possibile inoltrare-navigare verso un'istanza della vecchia pagina utilizzando l'API di navigazione nativa del telefono.

+0

Ok, vedo ... c'è qualcosa che posso fare con questo comportamento? –

+0

Forse se spieghi perché questo è un problema ... –

Problemi correlati