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
.
Si prega di condividere il codice del vostro controllo, siamo in grado di guardare in quella.
UPDATE:
Ecco un esempio di come un DependecyObject's
DependencyProperty
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 Button
XAML
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.
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
@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. –