2016-04-14 9 views
7

Nachdem ich ein wenig über den Cannot find governing FrameworkElement or FrameworkContentElement for target element Fehler recherchiert habe, habe ich herausgefunden, dass Abhängigkeitsobjekte keine bindbaren Abhängigkeitseigenschaften haben können, es sei denn, sie sind FrameworkElements oder sind im Elementbaum von eins.DependencyObject kann das FrameworkElement für das Zielelement nicht finden, selbst wenn dieses Objekt im Logical Tree eines FrameworkElementes ist

Allerdings habe ich ein FrameworkElement, das DependencyObjects besitzt, und ich kann keine Bindungen an diese DependencyObjects-Eigenschaften senden, obwohl sie Teil der logischen Struktur des FrameworkElement sind.

Ich schreibe ein komplexes benutzerdefiniertes Steuerelement mit Unterelementen, und ich brauche diese Unterelemente DependencyObjects (aber nicht FrameworkElements, weil sie mit vielen Eigenschaften verschmutzt werden, die nicht verwendet werden, und es könnte Benutzer verwirren), und ich brauche auch ihre Abhängigkeitseigenschaften, um bindbar zu sein.

Was fehlt mir? Gibt es noch etwas, das ich den DependencyObjects mitteilen muss, damit sie wissen, dass sie sich in einem logischen Baum befinden? Soll ich sie einfach Freezables machen, auch wenn es keinen Sinn macht, dass sie eingefroren werden?

Prost

+0

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

+0

@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. –

Antwort

1

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.

UIElement

Bitte den Code Ihrer Kontrolle teilen, können wir in diesem Blick.

UPDATE:

Hier ist ein Beispiel, wie ein DependecyObject'sDependencyProperty 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.

+1

Autor bedeutet eine andere Sache. Versuchen Sie und Sie werden sehen, was das Problem ist (es wird nicht funktionieren). Erben Sie jetzt Ihre MyClass von Freezable und es wird dann funktionieren. – Evk

+0

@Evk Nicht sicher über Freezable verwenden Sie hier, aber anders als das, wiederholen Sie etwas, was ich oben erklärt habe. Mein ganzer Punkt war, wenn OP etwas wie das Binden der DP in dependencyObject tun würde, kann er es auf andere Weise von anderen UI-Elementen aus tun, wenn es für ihn machbar ist. –

+0

@Evk spricht von Freezable Ich erinnere mich, dass es Probleme mit der Bindung und/oder mit Binding Verhalten verursacht (DP-Wert Reflexion ich erinnere mich, obwohl nicht sehr sicher), so Art von riskant zu verwenden –

Verwandte Themen