Ich glaube, Sie Schlussfolgerungen & Schlüsse sind nicht ganz korrekt.
Das erste, was ist in WPF
alles von DependencyObject
abgeleitet. FrameworkElement
Klasse ist nicht anders. Wenn Sie an der Hierarchie der classs FrameworkElement
aussehen Es ist wie unten Order:
DependencyObject
->Visual
->UIElement
->FrameworkElement
Also, wenn Sie versuchen, zu erstellen a Dependency Property
in einer Klasse, die von einer der oben genannten Klassen abgeleitet ist, wird es gut funktionieren (ohne direkte Bindung, aber die andere Art der Bindung funktioniert (siehe Beispiel unten)). Es muss ein Problem mit Ihrem CustomControl
(Nicht sicher, ob Sie einen CustomControl
oder UserControl
) Code verwenden.
Aber Klassen abgeleitet von UIElement
auch DependencyProperties
haben können, die an andere Elemente gebunden werden können.
siehe UIElement
Klasse, es viel DependencyProperties
hat.
Bitte den Code Ihrer Kontrolle teilen, können wir in diesem Blick.
UPDATE:
Hier ist ein Beispiel, wie ein DependecyObject's
DependencyProperty
gebunden werden kann:
DependencyObject
Umsetzung:
public class MyClass : DependencyObject
{
public MyClass()
{
this.Button = new Button();
Button.Width = 500;
Button.Height = 400;
Button.Content = "Bound to Window Height";
}
private Binding height;
public Binding Height
{
get { return height; }
set
{
height = value;
ApplyBinding();
}
}
public Button Button { get; set; }
private void ApplyBinding()
{
this.Button.SetBinding(Button.HeightProperty, this.Height);
}
}
A UserControl
die unsere DependencyObject
Implementierung verwendet:
public partial class MyUserControl : UserControl
{
public MyUserControl()
{
InitializeComponent();
}
public MyClass MyClass
{
get { return (MyClass)GetValue(MyClassProperty); }
set { SetValue(MyClassProperty, value); }
}
// Using a DependencyProperty as the backing store for MyClass. This enables animation, styling, binding, etc...
public static readonly DependencyProperty MyClassProperty =
DependencyProperty.Register("MyClass", typeof(MyClass), typeof(MyUserControl), new UIPropertyMetadata(new PropertyChangedCallback(MyClassPropertyChanged)));
private static void MyClassPropertyChanged(DependencyObject DO, DependencyPropertyChangedEventArgs e)
{
var MUC = DO as MyUserControl;
if (e.NewValue != null)
{
var myClass = e.NewValue as MyClass;
MUC.MyCanvas.Children.Add(myClass.Button);
}
}
}
Und schließlich Bindung:
<Window x:Class="WpfStackOverflowTempProject.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Width="525"
DataContext="{Binding RelativeSource={RelativeSource Mode=Self}}"
xmlns:local="clr-namespace:WpfStackOverflowTempProject"
Height="{Binding ElementName=UIContent,Path=MyClass.HeightReplica,Mode=OneWayToSource}"
>
<local:MyUserControl x:Name="UIContent" >
<local:MyUserControl.MyClass>
<local:MyClass Height="{Binding RelativeSource={RelativeSource AncestorType=Window},Path=ActualHeight,Mode=OneWay}" />
</local:MyUserControl.MyClass>
</local:MyUserControl>
So als Ausgabe von oben Programm, wenn Height
unserer Window
Änderungen, es Knopf zurück zu unserer MyClass
Komponente reflektiert wird element
wie wir Button
Bindung getan haben, selbst in XAML
Code. So ist die Myclass
ist eine Schnittstelle zwischen es ist logisch übergeordneten Steuerung & es zur Festlegung der exponierten Eigenschaften/Bindungen und Definition der behave von ihnen entsprechend den untergeordneten Elemente Kinder Elemente ist, , die auf der Benutzeroberfläche tatsächlich sichtbar sein und MyClass
funktioniert nur wie ein Filter für idiomatische Anwendungen.
Jede Abhängigkeitseigenschaft ist bindbar, nur funktioniert keine explizite Quelle. Wie für Ihre Frage: ab jetzt scheint es, dass, wenn Ihre Eigenschaft nicht Teil der visuellen oder logischen Struktur ist - Ihre einzige Option, um es übergeordneten Datenkontext zu erben ist in der Tat machen es Freezable. – Evk
@Evk: Nach ein wenig Recherche und Spielen habe ich herausgefunden, dass meine Eigenschaften nicht im Live Tree Inspector angezeigt werden. Ich muss das weiter untersuchen, da ich sicher war, dass das Überschreiben des LogicalChildren-Enumerators ausreichen würde. –