WPF Liaison de contrôle interne avec les parents de contexte de données
J'ai fait un contrôle utilisateur
<UserControl x:Class="MyApp.MyControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d" x:Name="uc">
<Grid Width="Auto" Height="Auto">
<TextBlock Text="{Binding Path=DataContext.TextContent, ElementName=uc}"/>
<TextBlock Text="{Binding Path=DataContext.TextContent2, ElementName=uc}"/>
</Grid>
Je veux les sous-contrôles dans les régimes de contrôle(uc) vont se lier aux propriétés de l'uc.DataContext. J'ai utilisé le contrôle défini comme suit:
<Window x:Class="Tms.TMSClient.Views.MainWindow" Name="window"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:control="clr-namespace:MyApp"
xmlns:ribbon="clr-namespace:Microsoft.Windows.Controls.Ribbon;assembly=RibbonControlsLibrary">
<control:MyControl DataContext="{Binding Path=MyControlVM}"/>
Le DataContext qui est attribué à la fenêtre a cette structure: WindowVM.MyControlVM.TextContent.
Le code donné ne fonctionne pas parce que la zone de texte du DataContext est lié à WindowVM à la place. Je pense que le problème est peut-être parce que l'intérieure de la zone de texte est lié avant la définition de contrôle (uc) est donc la délimitée DataContext pour uc ne prend pas effet.
Ce que je veux, c'est: le contrôle personnalisé (MyControl) sera lié à son correspondant viewmodel (MyControlVM), et les éléments intérieurs de MyControl sera lié aux propriétés de MyControlVM.
Avez-vous des solutions pour ce problème?
DataContext = this
dans MyApp.MyControl
? Aussi, si vous ne changez pas DataContext
dans le contrôle {Binding TextContent}
devrait être suffisantVous définissez
MyControlVM.DataContext
à MyControlVM
, et depuis il est hérité par le biais de visual arbre, tout à l'intérieur, par défaut et jusqu'à la modification de il aura qui DataContext
. Dans votre cas TextBlock
, Grid
et UserControl
aura le même DataContext
définie à partir de l'extérieur de MyControlVM
OriginalL'auteur Thomas Lee | 2014-10-24
Vous devez vous connecter pour publier un commentaire.
fonctionne pour moi dans mon test de l'application.
MainWindow.xaml
MyControl.xaml
DataContexts:
OriginalL'auteur mDC
Si je vous comprends bien, vous voulez lier des données d'une propriété à partir de votre
MyControl
modèle de vue pour unTextBox.Text
de la propriété à l'intérieur de laMyControl UserControl
. Si cela est exact, alors vous pouvez utiliser unRelativeSource de Liaison
, ou leElementName
de la syntaxe que vous utilisez déjà.D'abord, assurez-vous que votre modèle de vue est défini comme le
DataContext
pour laUserControl
:Que les contrôles enfants héritent automatiquement de leurs parents
DataContext
objets, vous pouvez maintenant faire référence à ce modèle de vue de laTextBox
par le biais de laMyControl.DataContext
bien de laUserControl
's XAML:C'est tout ce dont vous avez besoin.
OriginalL'auteur Sheridan
Par défaut à tous les contrôles hérite de son DataContext de son parent de contrôle. Ainsi, il n'est pas nécessaire explicitement lier à elle.
En effet, lorsque vous souhaitez lier un contrôle du DataContext de imbriquée propriété, alors vous devez spécifier ceci:
Wow @ThomasLee, vous n'êtes vraiment pas à l'écoute de tout le monde ici, et vous? LE
DataContext
EST AUTOMATIQUEMENT HÉRITÉE PAR TOUS LES CONTRÔLES ENFANTS PAR DÉFAUT. Je ne vois pas de problème avec votre code comme il se trouve, de sorte que vous avez quelque chose d'autre interférer avec elle.OriginalL'auteur Dennis Kassel