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();
}
}
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
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 –
http://msdn.microsoft.com/en-us/library/ms754209.aspx – SLaks