2010-08-17 11 views
5

Ich habe ein UserControl, das eine benutzerdefinierte DependencyProperty hat. Wenn ich das UserControl von innerhalb einer DataTemplate verwende, kann ich den Wert DependencyProperty nicht festlegen. Wenn ich das UserControl direkt in einem Fenster verwende, dann funktioniert das DependencyProperty gut. Ich entschuldige mich für die lange Post, ich habe den Code auf das Minimum vereinfacht, das zeigt immer noch das Problem, das ich in meinem Projekt habe. Danke für jede Hilfe, ich weiß nicht, was ich noch versuchen soll.Warum wird eine benutzerdefinierte Eigenschaft in einem UserControl nicht festgelegt, wenn das Steuerelement in einem DataTemplate verwendet wird?

Hauptfenster 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> 

Hauptfenster Code:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     this.DataContext = this; 
     TheTextVM = new TextVM(); 
    } 

    public TextVM TheTextVM { get; set; } 
} 

Usercontrol XAML:

<UserControl ...> 
    <Grid> 
     <TextBlock x:Name="textBlock"/> 
    </Grid> 
</UserControl> 

Usercontrol-Code:

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

Antwort

2

Ich kann das Problem reproduzieren, aber ich habe keine Ahnung, was es verursacht ... Anscheinend funktioniert es, wenn Sie die Initialisierung aus dem Konstruktor entfernen. Wenn der Standardwert konstant ist, ist es am besten, ihn als Standardwert für die Abhängigkeitseigenschaft zu verwenden, anstatt ihn im Konstruktor festzulegen.

Wie auch immer, was versuchst du genau zu machen? Konnte es nicht durch eine Bindung an das ViewModel erreicht werden?

+0

Vielen Dank! Ich habe nicht über die Initialisierung im Konstruktor nachgedacht. In meinem Fall ist die Eigenschaft ein Zeitstempel und ich wollte, dass die Instanz einen Standardwert hat, als das Objekt erstellt wurde und nicht, als die Registrierung der statischen Eigenschaft erfolgte. Aber diese Eigenschaft ist sowieso an eine VM gebunden, also initialisiere ich sie jetzt in der VM. Dies wird für den Moment ausreichen, macht mich aber immer noch verwirrt, was den Unterschied zwischen dem Einfügen des Steuerelements in das Fenster und dem Einfügen in das DataTemplate betrifft. By the way, binden MyText an die VM das gleiche Problem, wenn MyText im Konstruktor initialisiert wird. – Carlos

+0

Sie sollten Ihre Frage wahrscheinlich in den MSDN-Foren veröffentlichen, damit jemand aus MS antworten kann. Ich denke, dieses Verhalten könnte ein Fehler sein –

+0

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