2008-11-17 24 views
14

Ho un controllo utente in cui il controllo XAML del controllo può legarsi alle proprietà appropriate dal contesto dati del genitore come normale (il contesto dati si propaga in xaml).DataContext del controllo utente WPF è Null

Ad esempio, ho una finestra il cui DataContext sto impostando su ObjectA ad esempio. Il mio controllo utente all'interno della finestra viene quindi provare a accedere alle proprietà all'interno XAML il DataContext

Così la mia finestra e codice dietro può sia vedere un DataContext non nullo.

Il mio controllo a cui DataContext si propaga può vedere un DataContext non nullo in Xaml ma non nel codice retrostante.

Qual è il modo corretto di gestirlo?

risposta

19

in mancanza di questo, se avete bisogno di controllare se il DataContext viene impostata è possibile utilizzare il DataContextChanged

public partial class UserControl1 : UserControl 
{ 
    public UserControl1() 
    { 
     InitializeComponent(); 

     DataContextChanged += new DependencyPropertyChangedEventHandler(UserControl1_DataContextChanged); 
    } 

    void UserControl1_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e) 
    { 
     // You can also validate the data going into the DataContext using the event args 
    } 
} 

Nota è solito entrare UserControl1_DataContextChanged fino DataContext passa da zero ad un valore diverso.

Non sicuro se questo risponde alla tua domanda, ma può essere abbastanza utile da usare nei problemi di debug.

+1

Ho dovuto sottoscrivere l'evento DataContextChanged prima di InitializeComponent in modo da poter gestire l'evento alla prima impostazione di DataContext. – Darlene

+0

Funziona anche per fare: DataContextChanged + = UserControl1_DataContextChanged; – Skychan

11

Penso che si stia controllando "DataContext" nel costruttore di UserControl. Sarà nullo al Costruttore poiché il controllo utente non è ancora stato creato mentre l'esecuzione è nel codice costruttore. Ma controlla la proprietà all'evento Loaded vedrai l'oggetto correttamente.

public partial class UserControl1 
{ 
    public UserControl1() 
    { 
     this.InitializeComponent(); 

     //DataContext will be null here 
     this.Loaded += new RoutedEventHandler(UserControl1_Loaded); 
    } 

    void UserControl1_Loaded(object sender, RoutedEventArgs e) 
    { 
     //Check DataContext Property here - Value is not null 
    } 
} 
+0

noope. Lo sto verificando nel contesto della classe. –

+0

Non sono sicuro se qualcosa è cambiato da questa risposta - ma l'evento Loaded ha un contesto di NULL. – Pakk

+0

Nel mio programma (.NET Framework 4.6.2), DataContext viene infatti inizializzato dopo l'esecuzione di InitializeComponent. – blearyeye

10

Vorrei verificare se si verifica un errore di associazione in fase di esecuzione. Aggiungere questo spazio dei nomi al XAML:

xmlns:debug="clr-namespace:System.Diagnostics;assembly=System" 

e verificare finestra di output del debugger per i messaggi di errore relativi.

In alternativa, puoi mostrarci altro codice?

+1

Grazie ... questo è dolce ... Vorrei averlo trovato questa settimana fa ... lol. –

+0

Grazie, grazie, grazie .... giorno == salvato –

+0

Felice di aver fatto una grande differenza. E grazie per l'upvote. – hughdbrown

Problemi correlati