Ho creato un UserControl con alcune DependencyProperties (nell'esempio qui solo una proprietà stringa). Quando istanzio Usercontrol, posso impostare la proprietà di UserControl e viene visualizzato come previsto. Quando sto cercando di sostituire il testo statico con Binding, non viene visualizzato nulla.Associazione a UserControl DependencyProperty
mio UserControl si presenta come segue:
<User Control x:Class="TestUserControBinding.MyUserControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="30" d:DesignWidth="100">
<Grid>
<Label Content="{Binding MyText}"/>
</Grid>
</UserControl>
codice dietro è:
namespace TestUserControBinding {
public partial class MyUserControl : UserControl {
public MyUserControl() {
InitializeComponent();
this.DataContext = this;
}
public static readonly DependencyProperty MyTextProperty =
DependencyProperty.Register(
"MyText",
typeof(string),
typeof(MyUserControl));
public string MyText {
get {
return (string)GetValue(MyTextProperty);
}
set {
SetValue(MyTextProperty, value);
}
}// MyText
}
}
Quando provo questo nel mio MainWindow, tutto è come previsto:
<Window x:Class="TestUserControBinding.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TestUserControBinding"
Title="MainWindow" Height="350" Width="525">
<StackPanel>
<local:MyUserControl MyText="Hello World!"/>
</StackPanel>
</Window>
Ma questo non funziona:
<Window x:Class="TestUserControBinding.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TestUserControBinding"
Title="MainWindow" Height="350" Width="525">
<StackPanel>
<local:MyUserControl MyText="{Binding Path=Text}"/>
<Label Content="{Binding Path=Text}"/>
</StackPanel>
</Window>
Il comportamento del marchio è corretta, quindi non c'è alcun problema con il "testo" Proprietà
Qual è il mio errore? Medito per ore, ma non riesco a trovare nulla che ho dimenticato.
@Brian ... Il codice "this.DataContext = this;" dovrebbe occuparsi di impostare DataContext su local. Non dovrebbe? – Nishant
Oh, sì, mi sono perso. Ma se stai creando un 'UserControl', non penso sia una buona idea impostare manualmente' DataContext'. Il 'DataContext' è destinato a rappresentare il contesto ereditato o assegnato dal contenitore. L'associazione 'RelativeSource' consente di ottenere il risultato desiderato (associazione a' DependencyProperty') senza interrompere il flusso ereditario 'DataContext' standard. Tentare di sovrascrivere il 'DataContext' come si avrà non riuscirà se l'utente del tuo' UserControl' imposta il proprio 'DataContext'. –
quello era esattamente il problema.Invece di impostare DataContext di MyUserControl su se stesso ora uso 'x: Name =" MyName "' nel tag di apertura di 'MyUserControl' e il Binding cambia in:' " Penso che la soluzione dovrebbe funzionare, ma è un po 'ingombrante. – Buchter