2010-08-17 10 views
5

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(); 
    } 
} 

Respuesta

2

Puedo reproducir el problema, pero no tengo idea de qué lo está causando ... Aparentemente funciona si elimina la inicialización del constructor. Si el valor predeterminado es constante, la mejor opción es usarlo como el valor predeterminado de la propiedad de dependencia, en lugar de establecerlo en el constructor.

De todos modos, ¿qué intentas hacer exactamente? ¿No podría lograrse mediante un enlace en ViewModel?

+0

¡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

+0

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 –

+0

http://msdn.microsoft.com/en-us/library/ms754209.aspx – SLaks

Cuestiones relacionadas