2010-09-02 4 views
3

Je voulais faire un contrôle utilisateur rapide pour mon application, mais pour garder les choses dans un style MVVM je pensais que je définirais le DataContext du code XAML au code derrière dans mon UserControl.WPF MVVM - Le contrôle personnalisé ne liera pas à la visibilité si je mets le DataContext au code derrière

à savoir

DataContext="{Binding RelativeSource={RelativeSource Self}}" 

Cela me permet de lier le XAML aux propriétés dans mon code derrière. Tout s'est bien passé jusqu'à ce que je vienne lier la visibilité d'une instance du contrôle à une propriété Visibility sur un ViewModel.

<Controls:RoundProgress Visibility="{Binding ProgressVisibility}" Width="100" Height="100"></Controls:RoundProgress> 

La visibilité ne fonctionne plus - si je retire mes bricolages avec le DataContext du contrôle de l'utilisateur - les travaux de visibilité!

Quelqu'un peut-il me donner raison s'il vous plaît? Merci

Répondre

10

Ne pas définir le DataContext de UserControl lui-même à partir du XAML interne. En faisant cela, vous substituez le DataContext hérité et faites en sorte que votre liaison recherche une propriété ProgressVisibility sur l'UC au lieu de votre ViewModel. Au lieu de définir le DataContext sur un élément à l'intérieur de l'UC:

<UserControl x:Class...> 
    <Grid DataContext="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}}"> 
    ... 
    </Grid> 
</UserControl> 
+0

Merci, cela fonctionne parfaitement. –

+0

J'ai essayé ça. cela m'a donné une erreur. La propriété 'AncestorType' n'existe pas sur le type 'RelativeSource' dans l'espace de noms XML 'http://schemas.microsoft.com/winfx/2006/xaml/presentation'. – user20358

+0

Pour être clair, le DataContext que vous spécifiez en XAML sera défini pendant 'InitializeCompenent()'. –

1

DataContext est héritée. Si vous avez modifié le DataContext de votre contrôle pour qu'il ne référence plus le viewmodel et qu'il pointe vers lui-même, les contrôles enfants ne pourront plus accéder aux propriétés du viewmodel.

Si vous avez une propriété dans votre code-behind qui pointe vers le viewmodel vous pouvez le faire:

<Controls:RoundProgress Visibility="{Binding ViewModel.ProgressVisibility}" ... 

Ou vous pouvez laisser le datacontext tout comme (pointant vers le viewmodel) et ajoutez la source par rapport à toutes les liaisons où vous voulez que les données proviennent de codebehind à la place - par exemple:

<Button Text="{Binding ButtonText, Source={RelativeSource Mode=FindAncestor, AncestorType={x:Type MyUserControl}}}"/> 
Questions connexes