Ist es nicht möglich, mehrere UserControl-Schichten mit ContentControl zu erstellen?Inhalt von WPF ContentControl als ContentControl
Ich versuche, Ansichten für verschiedene abgeleitete Modelle zu erstellen, also möchte ich die Notwendigkeit, die Ansichten für jeden Objekttyp neu zu erstellen, beseitigen und stattdessen ein ContentControl oder einen ContentPresenter bereitstellen, um die " Rest der Aussicht ". Allerdings kann ich mit dieser Methode nur eine Stufe tiefer gehen.
Hier ist ein vereinfachtes Beispiel (Ich habe einige der xmlns entfernt). In meinem Fall arbeite ich mit wesentlich komplexeren Views und versuche, doppelten Code an mehreren Stellen zu eliminieren, die später auf Änderungen reagieren.
ich eine Basisusercontrol haben, werden wir es nennen
UserControlLevel1<UserControl x:Class="ContentControlNesting.UserControlLevel1"
x:Name="userControlLevel1"
xmlns:local="clr-namespace:ContentControlNesting">
<StackPanel>
<TextBlock Text="UserControlLevel1ContentTop"/>
<ContentControl Content="{Binding ElementName=userControlLevel1, Path=ChildContent}"/>
<TextBlock Text="UserControlLevel2ContentBottom"/>
</StackPanel>
</UserControl>
Es hat die folgenden DependencyProperty auf dem Usercontrol
namespace ContentControlNesting
{
public partial class UserControlLevel1 : UserControl
{
public UserControlLevel1()
{
InitializeComponent();
}
public static readonly DependencyProperty ChildContentProperty = DependencyProperty.Register("ChildContent", typeof(UIElement), typeof(UserControlLevel1), new PropertyMetadata(null));
public UIElement ChildContent
{
get { return (UIElement)GetValue(ChildContentProperty); }
set { SetValue(ChildContentProperty, value); }
}
}
}
Die Content wird im folgenden genannt Usercontrol UserControlLevel2 verwendet werden. Dieses UserControl funktioniert einwandfrei, so wie ich es erwarten würde. Oder eher UserControlLevel1 funktioniert ordnungsgemäß in UserControlLevel2.
<UserControl x:Class="ContentControlNesting.UserControlLevel2"
x:Name="userControlLevel2"
xmlns:local="clr-namespace:ContentControlNesting">
<local:UserControlLevel1>
<local:UserControlLevel1.ChildContent>
<StackPanel>
<TextBlock Text="UserControlLevel2ContentTop"/>
<ContentControl Content="{Binding ElementName=userControlLevel2, Path=ChildContent}"/>
<TextBlock Text="UserControlLevel2ContentBottom"/>
</StackPanel>
</local:UserControlLevel1.ChildContent>
</local:UserControlLevel1>
</UserControl>
Ebenso hat es eine einzige DependencyProperty für die Content auf dieser Usercontrol wie die erste. Ich habe das auch mit anders benannten DependencyProperties versucht.
namespace ContentControlNesting
{
public partial class UserControlLevel1 : UserControl
{
public UserControlLevel1()
{
InitializeComponent();
}
public static readonly DependencyProperty ChildContentProperty = DependencyProperty.Register("ChildContent", typeof(UIElement), typeof(UserControlLevel1), new PropertyMetadata(null));
public UIElement ChildContent
{
get { return (UIElement)GetValue(ChildContentProperty); }
set { SetValue(ChildContentProperty, value); }
}
}
}
Okay, an diesem Punkt scheint alles in Ordnung zu sein. Ich habe zusätzlichen Inhalt in dem ContentControl von UserControlLevel1 hinzugefügt, und ich habe ein anderes ContentControl in meinem UserControlLevel2 UserControl hinzugefügt.
Das Problem ist, wenn ich versuche, eine dritte Tier von entweder UserControl oder MainWindow einzuführen. Alles, was ich dem ContentControl von UserControlLevel2 hinzufüge, erscheint einfach nicht.
<Window x:Class="ContentControlNesting.MainWindow"
xmlns:local="clr-namespace:ContentControlNesting"
Title="MainWindow" Height="200" Width="300">
<local:UserControlLevel2>
<local:UserControlLevel2.ChildContent>
<StackPanel>
<TextBlock Text="Main Window Content Text"/>
</StackPanel>
</local:UserControlLevel2.ChildContent>
</local:UserControlLevel2>
</Window>
Mache ich etwas, das nicht möglich ist? Oder mache ich etwas falsch mit ContentControl und den DependencyProperties? Soll ich das mit einem anderen Ansatz betrachten?
ich auf diese Antwort gestolpert - stackoverflow.com/a/5758383/2777422 auf eine ähnliche, aber andere Frage. Die Bedürfnisse waren unterschiedlich, aber der Inhalt einer der Antworten schien mir zunächst in die richtige Richtung zu weisen. Es wird empfohlen, ein ControlTemplate zu verwenden. Meine Frage ist, warum erlaubt es mir, mehr als 2 Ebenen tief zu gehen? Letztendlich ist dies auch nicht die perfekte Antwort, da ich die Intellisense-Datenbindung verliere und nachdem ich einige DependencyProperties erstellt habe, um die Textwerte in den oben genannten UserControlLevel1-Textblöcken zu steuern, wird der Standardwert in einer ControlTemplate nicht angezeigt. – Jeremy