Tengo un UserControl que tiene un DependencyProperty
personalizado. Cuando uso el UserControl desde adentro de DataTemplate
, no puedo establecer el valor de DependencyProperty
. Si utilizo el UserControl directamente en una ventana, entonces el DependencyProperty
funciona bien. Me disculpo por la publicación larga, simplifiqué el código al mínimo que aún muestra el problema que tengo en mi proyecto. Gracias por cualquier ayuda, no sé qué más probar.¿Por qué no se establece una propiedad personalizada en un UserControl cuando se utiliza el control en una plantilla de datos?
ventana principal XAML:
<Window ...>
<Window.Resources>
<DataTemplate DataType="{x:Type local:TextVM}">
<local:TextV MyText="I do not see this"/> <!--Instead I see "Default in Constructor"-->
</DataTemplate>
</Window.Resources>
<Grid>
<Border BorderThickness="5" BorderBrush="Black" Width="200" Height="100" >
<StackPanel>
<ContentControl Content="{Binding Path=TheTextVM}"/>
<local:TextV MyText="I see this"/>
</StackPanel>
</Border>
</Grid>
</Window>
principal Código Ventana:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.DataContext = this;
TheTextVM = new TextVM();
}
public TextVM TheTextVM { get; set; }
}
control de usuario XAML:
<UserControl ...>
<Grid>
<TextBlock x:Name="textBlock"/>
</Grid>
</UserControl>
Código UserControl:
public partial class TextV : UserControl
{
public TextV()
{
InitializeComponent();
MyText = "Default In Constructor";
}
public static readonly DependencyProperty MyTextProperty =
DependencyProperty.Register("MyText", typeof(string), typeof(TextV),
new PropertyMetadata("", new PropertyChangedCallback(HandleMyTextValueChanged)));
public string MyText
{
get { return (string)GetValue(MyTextProperty); }
set { SetValue(MyTextProperty, value); }
}
private static void HandleMyTextValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs args)
{
TextV tv = d as TextV;
if(tv != null) tv.textBlock.Text = args.NewValue.ToString();
}
}
¡Muchas gracias! No pensé en la inicialización en el constructor. En mi caso, la propiedad es una marca de tiempo y quería que la instancia tuviera un valor predeterminado cuando se creó el objeto y no cuando ocurrió el registro de la propiedad estática. Pero esa propiedad está ligada a una máquina virtual de todos modos, así que ahora voy a inicializar eso en la máquina virtual. Esto funcionará por el momento, pero aún me deja perplejo la diferencia entre poner el control en la ventana y ponerlo en el DataTemplate. Por cierto, vincular MyText a la VM muestra el mismo problema, si MyText se inicializa en el constructor. – Carlos
Probablemente debería publicar su pregunta en los foros de MSDN, para que alguien de MS pueda responder. Creo que este comportamiento podría ser un error –
http://msdn.microsoft.com/en-us/library/ms754209.aspx – SLaks