2016-04-14 3 views
7

Dopo aver ricercato un bit sull'errore Cannot find governing FrameworkElement or FrameworkContentElement for target element, ho scoperto che gli oggetti di dipendenza non possono realmente avere proprietà di dipendenza associabili a meno che non siano FrameworkElements o nell'albero dell'elemento di uno.DependencyObject non è in grado di trovare FrameworkElement che governa per l'elemento di destinazione, anche se quell'oggetto si trova nell'albero logico di un FrameworkElement

Tuttavia, ho un FrameworkElement che detiene DependencyObjects e non posso inviare binding a tali proprietà DependencyObjects anche se fanno parte dell'albero logico di FrameworkElement.

Sto scrivendo un controllo personalizzato complesso con elementi secondari e ho bisogno di questi elementi secondari per essere DependencyObjects (ma non FrameworkElements, perché vengono inquinati con molte proprietà che non vengono utilizzate e potrebbero confondere gli utenti), e ho anche bisogno che le loro proprietà di dipendenza siano associabili.

Cosa mi manca? C'è qualcos'altro che devo dire a DependencyObjects in modo che sappiano che si trovano in una struttura logica? Dovrei semplicemente renderli FreeZillables anche se non ha senso che siano congelati?

Acclamazioni

+0

Qualsiasi proprietà di dipendenza è associabile, solo non funziona senza Sorgente esplicita. Per quanto riguarda la tua domanda: al momento sembra che se la tua proprietà non fa parte di un albero visivo o logico, l'unica opzione per far sì che erediti il ​​contesto di dati padre è effettivamente renderla Freezable. – Evk

+0

@Evk: Dopo un po 'di ricerche e di giochi, ho scoperto che le mie proprietà non verranno visualizzate su Live Tree Inspector. Devo investigare ulteriormente, dato che ero sicuro che sovrascrivere l'enumeratore di LogicalChildren sarebbe stato sufficiente. –

risposta

1

penso che le conclusioni & inferenze non sono del tutto corrette.

prima cosa è in WPF tutto è derivato da DependencyObject. FrameworkElement La classe non è diversa. Se si guarda alla gerarchia della FrameworkElement classs E 'come di seguito Order:

DependencyObject ->Visual ->UIElement ->FrameworkElement

Quindi, se si tenta di creare a Dependency Property in una classe derivata da una delle classi precedenti, funzionerà perfettamente (esclusa la rilegatura diretta ma l'altra modalità vincolante funziona (vedi esempio sotto)). Deve esserci un problema con il tuo CustomControl (Non sei sicuro di utilizzare un codice CustomControl o UserControl).

Ma classi derivate da UIElement possono anche avere DependencyProperties che può essere legato ad altri elementi.

vedere UIElement classe, Ha molta DependencyProperties.

UIElement

Si prega di condividere il codice del vostro controllo, siamo in grado di guardare in quella.

UPDATE:

Ecco un esempio di come un DependecyObject'sDependencyProperty può essere vincolato:

DependencyObject Implementazione:

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

} 

Un UserControl che utilizza Il nostro DependencyObject Implementazione:

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

} 

e infine Binding:

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

Così come output del programma di cui sopra, quando Height dei nostri Window cambiamenti, che verrà riflessa verso Pulsante nostro MyClass del componente element come abbiamo fatto vincolante per se stesso in ButtonXAML codice. Così il Myclass è un'interfaccia tra è il controllo padre logico & è elementi figli di specificare le proprietà esposte/bindings e definiscono la si comportano di loro corrispondenti agli elementi figlio, che in realtà saranno visibili nell'interfaccia utente e MyClass funzionerà solo come come un filtro per usi idiomatici.

+1

Autore significa una cosa diversa. Prova a fare e vedrai qual è il problema (non funzionerà). Ora eredita il tuo MyClass da Freezable e funzionerà allora. – Evk

+0

@Evk Non sono sicuro di usare Freezable qui, ma a parte questo, stai ripetendo quello che ho spiegato sopra. Tutto quello che intendevo dire, se OP stava facendo qualcosa come legare il DP in dependencyObject, può farlo in modo opposto rispetto ad altri elementi dell'interfaccia utente, se possibile per lui. –

+0

@Evk parlando di Freezable Ricordo che causava problemi con il binding e/o con il comportamento Binding (riflesso del valore DP che ricordo, anche se non molto sicuro), quindi rischioso usare gli sviluppatori –

Problemi correlati