Ho un UserControl a cui voglio partecipare in associazione dati. Ho impostato le proprietà di dipendenza nel controllo utente, ma non riesco a farlo funzionare.Associazione dati a un UserControl in WPF
L'uc visualizza il testo corretto quando lo chiamo con testo statico (ad esempio BlueText = "ABC"). Quando provo a collegarlo a una proprietà pubblica locale, è sempre vuoto.
<src:BlueTextBox BlueText="Feeling blue" /> <!--OK-->
<src:BlueTextBox BlueText="{Binding Path=MyString}" /> <!--UserControl always BLANK!-->
<TextBox Text="{Binding Path=MyString}" Width="100"/> <!--Simple TextBox Binds OK-->
Ho ridotto il codice al seguente esempio semplificato. Ecco il codice XAML di UserControl:
<UserControl x:Class="Binding2.BlueTextBox" ...
<Grid>
<TextBox x:Name="myTextBox" Text="{Binding BlueText}" Foreground="Blue" Width="100" Height="26" />
</Grid>
Qui è il codice dietro di UserControl:
public partial class BlueTextBox : UserControl
{
public BlueTextBox()
{
InitializeComponent();
DataContext = this; // shouldn't do this - see solution
}
public static readonly DependencyProperty BlueTextProperty =
DependencyProperty.Register("BlueText", typeof(string), typeof(BlueTextBox));
public string BlueText
{
get { return GetValue(BlueTextProperty).ToString(); }
set { SetValue(BlueTextProperty, value.ToString()); }
}
Questo sembra che dovessero essere veramente facili, ma non riesco a farlo funzionare. Grazie per l'aiuto!
Altre informazioni: Quando ho provato la correzione suggerita da Eugene, ho notato un comportamento particolare. Ho aggiunto un PropertyChangedCallback ai metadati; questo mi consente di osservare il valore di BlueText che si sta impostando. Quando si imposta la stringa su un valore statico (= "feeling blue"), viene generato l'evento PropertyChanged. Il caso di associazione dei dati non attiva PropertyChanged. Penso che questo significhi che il valore legato ai dati non viene inviato a UserControl. (Penso che il costruttore non venga chiamato nel caso statico)
Soluzione: I problemi sono stati correttamente identificati da Arcturus e jpsstavares. Innanzitutto, stavo sovrascrivendo il binding dei dati quando è impostato DataContext = this nel costruttore del controllo. Questo ha impedito il set-up del valore associato ai dati. Dovevo anche nominare il controllo x: Name = root, e specificare Binding ElementName = root int lo XAML. Per ottenere il binding TwoWay, avevo bisogno di impostare Mode = TwoWay nel chiamante. Ecco il codice corretto:
<src:BlueTextBox BlueText="{Binding Path=MyString, Mode=TwoWay}}" /> <!--OK-->
Ora il XAML nella UserControl:
<UserControl x:Class="Binding2.BlueTextBox" x:Name="root"...
<Grid>
<TextBox x:Name="myTextBox" Text="{Binding ElementName=root, Path=BlueText}" Foreground="Blue" Width="100" Height="26" />
</Grid>
Finalmente ho tolto il DataContext = questo nel costruttore di UserControl.
public BlueTextBox()
{
InitializeComponent();
//DataContext = this; -- don't do this
}
Grazie a tutti per l'enorme aiuto!
provato a installare sia AffectsRender e AffectsMeasure, ma questo non ha avuto alcun effetto. Grazie. – RaoulRubin