DataContext di UserControl

Sto creando un UserControl che voglio usare qualcosa come questo:

  

Finora, ho implementato controlli simili come questo:

       

dove Color e Text sono proprietà di dipendenza del controllo definito nel codice. Funziona, ma specificare ElementName ogni volta sembra non necessario.

Un’altra opzione che funziona è l’utilizzo

  

e non specificando ElementName s, ma non mi sembra neanche una soluzione pulita.

Ho due domande:

  1. Perché funziona?
  2. Qual è il modo migliore per fare qualcosa di simile?

Per il primo, prova:

  

E per la seconda domanda, penso che l’uso di ElementName o AncestorBinding sia il modo migliore per associare le proprietà di UserControl .

Perché non puoi usare ?

Questo è come useresti il ​​controllo

      

Ora, dato che abbiamo hardcoded il nostro contesto dati nel controllo, tenterà invece di cercare la proprietà ColorToUse sull’object ColorWithText e non sul ViewModel, che ovviamente fallirà.

Questo è il motivo per cui non è ansible impostare DataContext sul controllo utente. Grazie a Brandur per avermi fatto capire.

Qual è il modo migliore per fare qualcosa di simile?

Invece dovresti impostare DataContext nel primo elemento dell’interfaccia utente secondario nel tuo controllo.

Nel tuo caso lo vuoi

  

Ora hai un DataContext che si riferisce al tuo controllo in modo da poter accedere a qualsiasi proprietà di quel controllo usando i binding relativi.

Dovresti usare

 {Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=Color} 

per Databinding I dubbi relativi si riferiscono sempre a questo foglio.
http://www.nbdtech.com/Blog/archive/2009/02/02/wpf-xaml-data-binding-cheat-sheet.aspx

È ansible impostare il datacontext su sé stesso dal costruttore.

 public ColorWithText() { InitializeComponent(); DataContext = this; } 

Ora puoi semplicemente dire

       

So che è stata data una risposta, ma nessuna delle spiegazioni fornisce una comprensione di DataContext e come funziona. Questo link fa un ottimo lavoro per questo.

TUTTO QUELLO CHE VUOI SAPERE SUI DATABINDING IN WPF, SILVERLIGHT E WP7 (SECONDA PARTE)

In risposta alla tua domanda # 1

Perché funziona?

Questo è un riassunto del link sopra. DataContext non dovrebbe essere impostato su Self a livello di elemento UserControl. Questo perché interrompe l’Eredità di DataContext. Se si imposta su se stessi e si posiziona questo controllo su una finestra o un altro controllo, non erediterà il DataContext di Windows.

DataContext è ereditato da tutti gli elementi inferiori di XAML e da tutti gli XAML di UserControls, a meno che non venga sovrascritto da qualche parte. Impostando UserControl DataContext su se stesso, questo sovrascrive DataContext e interrompe l’Ereditarietà. Invece, annidalo di un elemento in profondità nella XAML, nel tuo caso, StackPanel. Inserisci qui il collegamento DataContext e collegalo a UserControl. Ciò preserva l’ereditarietà.

Vedi anche questo link qui sotto per una spiegazione dettagliata di questo.

UN MODELLO SEMPLICE PER LA CREAZIONE DI USERCONTROLS UTILIZZABILI IN WPF / SILVERLIGHT

In risposta alla tua domanda n. 2
Qual è il modo migliore per fare qualcosa di simile?

Vedere l’esempio di codice qui sotto.

      

Nota che una volta fatto questo, non avrai bisogno di ElementName su ogni legame.