J'ai un objet qui est instancié dans le code derrière, par exemple, le XAML est appelé window.xaml et dans le window.xaml.cs
protected Dictionary<string, myClass> myDictionary;
Comment puis-je lier cet objet à, par exemple, une vue de liste, en utilisant uniquement des balises XAML?
Mettre à jour:
(C'est exactement ce que j'ai dans mon code de test):
<Window x:Class="QuizBee.Host.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="{Binding windowname}" Height="300" Width="300"
DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Grid>
</Grid>
</Window>
Et dans codebehind
public partial class Window1 : Window
{
public const string windowname = "ABCDEFG";
public Window1()
{
InitializeComponent();
}
}
Supposons que le titre devienne "ABCDEFG", non? mais ça finit par ne rien montrer.
Réponses:
Vous pouvez définir le DataContext pour votre contrôle, formulaire, etc. comme ceci:
Clarification :
Le contexte de données défini sur la valeur ci-dessus doit être effectué à n'importe quel élément "possède" le code derrière - donc pour une fenêtre, vous devez le définir dans la déclaration de fenêtre.
J'ai votre exemple fonctionnant avec ce code:
Le DataContext défini à ce niveau est alors hérité par n'importe quel élément de la fenêtre (sauf si vous le modifiez explicitement pour un élément enfant), donc après avoir défini le DataContext pour la fenêtre, vous devriez pouvoir simplement faire une liaison directe aux propriétés CodeBehind à partir de n'importe quel contrôle sur la fenêtre.
la source
Il existe un moyen beaucoup plus simple de faire cela. Vous pouvez attribuer un nom à votre Window ou UserControl, puis la liaison par ElementName.
Window1.xaml
Window1.xaml.cs
la source
Bien que la réponse de Guy soit correcte (et correspond probablement à 9 cas sur 10), il convient de noter que si vous essayez de le faire à partir d'un contrôle dont le DataContext est déjà configuré plus haut dans la pile, vous le réinitialiserez lorsque vous définissez DataContext retour à lui-même:
Cela cassera bien sûr ensuite vos liaisons existantes.
Si tel est le cas, vous devez définir RelativeSource sur le contrôle que vous essayez de lier, plutôt que sur son parent.
c'est-à-dire pour la liaison aux propriétés d'un UserControl:
Étant donné à quel point il peut être actuellement difficile de voir ce qui se passe avec la liaison de données, cela vaut la peine de garder cela à l'esprit même si vous trouvez que ce paramètre
RelativeSource={RelativeSource Self}
fonctionne actuellement :)la source
Juste un peu plus de précision: une propriété sans 'get', 'set' ne pourra pas être liée
Je fais face au cas comme le cas du demandeur. Et je dois avoir les éléments suivants pour que la liaison fonctionne correctement:
la source
Définissez un convertisseur:
Liez à une définition personnalisée d'un dictionnaire. Il y a beaucoup de remplacements que j'ai omis, mais l'indexeur est le plus important, car il émet l'événement de modification de propriété lorsque la valeur est modifiée. Ceci est requis pour la liaison source-cible.
Dans votre fichier .xaml, utilisez ce convertisseur. Référencez-le d'abord:
Ensuite, par exemple, si votre dictionnaire a une entrée où la clé est "Nom", alors pour vous y lier: utilisez
la source
Faites de votre propriété "windowname" une propriété DependencyProperty et conservez la propriété restante.
la source
Dans votre code derrière, définissez le DataContext de la fenêtre sur le dictionnaire. Dans votre XAML, vous pouvez écrire:
Cela liera le ListView au dictionnaire.
Pour des scénarios plus complexes, il s'agirait d'un sous-ensemble de techniques derrière le modèle MVVM .
la source
Une façon serait de créer une ObservableCollection (System.Collections.ObjectModel) et d'y avoir vos données de dictionnaire. Ensuite, vous devriez être en mesure de lier ObservableCollection à votre ListBox.
Dans votre XAML, vous devriez avoir quelque chose comme ceci:
la source
J'avais exactement le même problème, mais le mien n'était pas parce que je définissais une variable locale ... J'étais dans une fenêtre enfant, et j'avais besoin de définir un DataContext relatif que je venais d'ajouter à la fenêtre XAML.
la source
Vous pouvez essayer x: Astuce de référence
la source