2009-09-17 5 views
1

Salut, je veux faire ce qui suit dans XAML:WPF: AFFECTATION élément enfant à la propriété en XAML

J'ai un FocusTarget de propriété dans ma classe de contrôle que je veux attribuer un UIElement de la classe actuelle. Est-ce possible en XAML?

<my:BaseControl x:Class="SectionControl" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"   
    FocusTarget="myCtrl"> // this fails   
     ..  
     <my:CodeBlockControl x:Name="myCtrl" />   
     ..  
</my:BaseControl> 

MISE À JOUR: je maintenant mis en œuvre la propriété comme propriété de dépendance, mais il semble que la cession n'occures, bien que je lui confient en XAML. Mais il n'y a pas compiler, ni erreur d'exécution:

en XAML:

FocusTarget="{Binding ElementName=myCtrl}" 

en cs:

public static readonly DependencyProperty FocusTargetProperty;  

    static BaseControl() 
    { 
     FrameworkPropertyMetadata metadata = new FrameworkPropertyMetadata(null); 
     FocusTargetProperty = DependencyProperty.Register("FocusTarget", typeof(FrameworkElement), typeof(BaseControl), metadata, Validate); 
    } 

    public FrameworkElement FocusTarget 
    { 
     get { return GetValue(FocusTargetProperty)as FrameworkElement; } 
     set { SetValue(FocusTargetProperty, value); } 
    } 
+0

pourrait votre rappel « Valider » être arrêter l'affectation en quelque sorte? Cela pourrait valoir la peine de le commenter temporairement pour voir s'il commence à fonctionner. –

+0

non c'est une méthode qui ne fait rien mais retourne toujours vrai – codymanix

+0

J'ai eu le problème des propriétés n'étant pas définies lorsque j'essaie de raccourcir faire un contrôle complet; mon contrôle personnalisé a été dérivé de UIElement. Leçon: dériver de Contrôle comme le dit le manuel! –

Répondre

2

Il peut y avoir un tas de raisons pour lesquelles {Binding ElementName=...} ne fonctionne pas pour vous. Il effectue une recherche via un contexte hérité, qui se propage à travers l'arborescence des éléments visuels. S'il n'y a aucun moyen de parcourir l'arbre visuel de la liaison à l'élément référencé, la liaison échouera. Par exemple, si my:CodeBlockControl est déclaré à l'intérieur de Resources, ou dans un ControlTemplate d'un certain contrôle, ou s'il y a un Popup entre lui et root (y compris implicite, comme par exemple introduit par ContextMenu), c'est ce qui va arriver.

Malheureusement, il n'y a pas de façon générale de référencer directement un autre élément du même XAML. Il y aura dans .NET 4.0 XamlReader, bien qu'il sera toujours désactivé pour BAML (et, par conséquent, pour WPF). Une alternative consiste à utiliser les ressources et {StaticResource} à la place:

<my:BaseControl x:Class="SectionControl" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    FocusTarget="{StaticResource myCtrl}"> 

    <my:BaseControl.Resources> 
    <my:CodeBlockControl x:Key="myCtrl" /> 
    </my:BaseControl.Resources> 

    ... 
    <!-- where it originally was --> 
    <StaticResource ResourceKey="myCtrl"/> 
    ... 

</my:BaseControl> 
1

Assurez-vous que FocusTarget est une propriété de dépendance, et lier le contrôle de votre cible en utilisant un élément de liaison :

<my:BaseControl x:Class="SectionControl" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    FocusTarget="{Binding ElementName=myCtrl}"> 
    .. 
    <my:CodeBlockControl x:Name="myCtrl" /> 
    .. 

+0

Je l'ai essayé mais mes valeurs de propriété sont nulles, bien qu'affectées dans le code xaml, même le PropertyChangedCallback ne se déclenche pas. Qu'est-ce qui pourrait mal tourner? – codymanix

+0

J'ai édité ma question pour montrer ce que j'ai fait – codymanix

0

La syntaxe de la liaison est de la forme: Target = "{Binding Source}"

Le cadre requiert que la cible soit toujours une propriété de dépendance, alors que la source peut être simplement une ancienne propriété CLR.

La réponse de Matt Hamilton devrait fonctionner.

+0

Mais ce n'est pas, au moins pour moi :(Voir j'ai édité ma question – codymanix

+1

En traitant des problèmes de liaison, je recherche généralement dans la fenêtre de sortie pour trouver des erreurs de liaison Ils commencent tous par System.Windows.DataError Donc, y a-t-il des erreurs dans la fenêtre Sortie? – Trainee4Life

+0

Non Je ne vois aucune erreur. – codymanix

Questions connexes