Associazione dati nei controlli utente WPF

Sto creando un UserControl per una serie di controlli condivisi da diverse windows. Uno dei controlli è un’etichetta che mostra il stream di qualche altro processo in termini di “numeri di protocollo”.

Sto cercando di offrire DataBinding con questa etichetta in modo che la finestra rifletta automaticamente lo stato del processo quando la variabile del numero di protocollo cambia.

Questo è il controllo utente XAML:

   

E questo è il codice dietro:

 public partial class MainControls { public MainControls() { InitializeComponent(); } public int ProtocolNumber { get { return (int)GetValue(ProtocolNumberProperty); } set { SetValue(ProtocolNumberProperty, value); } } public static DependencyProperty ProtocolNumberProperty = DependencyProperty.Register("ProtocolNumber", typeof(int), typeof(MainControls)); } 

Questo sembra funzionare perché se sul costruttore ho impostato ProtocolNumber su un valore arbitrario, questo si riflette nel controllo utente.

Tuttavia, quando si utilizza questo controllo utente nella finestra finale, si interrompe l’associazione dei dati.

XAML:

      

Code-Behind per la finestra:

 public partial class Window1 : Window { public Window1() { Number= 15; InitializeComponent(); } public int Number { get; set; } } 

Questo imposta il Numero protocollo su zero, ignorando il valore impostato su Numero.

Ho letto un esempio

se guardi la tua finestra di output dovresti vedere l’eccezione di binding.

Il problema che hai è il seguente: all’interno del tuo usercontrol collegherai l’etichetta al Protocollo DPNumero del tuo usercontrol e non al DataContext , quindi devi aggiungere ad esempio il nome dell’elemento al binding.

    (...)  

EDIT: per cancellare alcune cose, il tuo usercontrol funziona anche se cambi il binding nella tua MainWindow. ma devi associare al DataContext di MainWindow con RelativeSource.

   

Cosa hai in effetti:

  

=> Non impostare DataContext nelle dichiarazioni UserControl , utilizzare invece i collegamenti RelativeSource o ElementName .

Se non stai specificando la RelativeSource del binding, prova a impostare DataContext nel costruttore:

  public Window1() { Number= 15; DataContext = this; InitializeComponent(); }