Objets de liaison définis dans code-behind

J’ai un object qui est instancié dans le code derrière, par exemple, le XAML s’appelle window.xaml et dans le window.xaml.cs

protected Dictionary myDictionary; 

Comment puis-je lier cet object à une vue de liste, par exemple, en utilisant uniquement des balises XAML?

Mettre à jour:

(C’est exactement ce que j’ai dans mon code de test):

     

Et en codebehind

 public partial class Window1 : Window { public const ssortingng windowname = "ABCDEFG"; public Window1() { InitializeComponent(); } } 

Supposons que le titre devienne “ABCDEFG” non? mais ça finit par ne rien montrer.

Vous pouvez définir le DataContext pour votre contrôle, formulaire, etc. comme ceci:

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

Clarification :

Le contexte de données défini à la valeur ci-dessus doit être fait à 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 en travaillant avec ce code:

  

L’ensemble DataContext à ce niveau est hérité par n’importe quel élément de la fenêtre (sauf si vous le modifiez explicitement pour un élément enfant). Après avoir défini le DataContext pour la fenêtre, vous devriez pouvoir effectuer une liaison directe avec les propriétés CodeBehind à partir de n’importe quel contrôle. sur la fenêtre.

Il existe un moyen beaucoup plus simple de le faire. Vous pouvez atsortingbuer un nom à votre fenêtre ou à votre contrôle utilisateur, puis à la liaison avec ElementName.

Window1.xaml

    

Window1.xaml.cs

 public partial class Window1:Window { // the property must be public, and it must have a getter & setter public Dictionary myDictionary { get; set; } public Window1() { // define the dictionary items in the constructor // do the defining BEFORE the InitializeComponent(); myDictionary = new Dictionary() { {"item 1", new myClass(1)}, {"item 2", new myClass(2)}, {"item 3", new myClass(3)}, {"item 4", new myClass(4)}, {"item 5", new myClass(5)}, }; InitializeComponent(); } } 

Alors que la réponse de Guy est correcte (et correspond probablement à 9 cas sur 10), il est intéressant de noter que si vous essayez de le faire depuis un contrôle dont le DataContext est déjà placé, vous le réinitialiserez lorsque vous définissez DataContext retour à lui-même:

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

Cela va bien sûr briser vos liaisons existantes.

Si tel est le cas, vous devez définir le RelativeSource sur le contrôle que vous essayez de lier, plutôt que sur son parent.

c’est-à-dire pour la liaison avec les propriétés d’un UserControl:

 Binding Path=PropertyName, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}} 

Étant donné la difficulté actuelle de voir ce qui se passe avec la liaison de données, cela vaut la peine d’en tenir compte, même si vous trouvez que le paramètre RelativeSource={RelativeSource Self} fonctionne actuellement 🙂

Juste un petit éclaircissement: une propriété sans ‘get’, ‘set’ ne pourra pas être liée

Je suis confronté à l’affaire tout comme l’affaire du demandeur. Et je dois avoir les choses suivantes pour que la liaison fonctionne correctement:

 //(1) Declare a property with 'get','set' in code behind public partial class my_class:Window { public Ssortingng My_Property { get; set; } ... //(2) Initialise the property in constructor of code behind public partial class my_class:Window { ... public my_class() { My_Property = "my-ssortingng-value"; InitializeComponent(); } //(3) Set data context in window xaml and specify a binding    

Définir un convertisseur:

 public class RowIndexConverter : IValueConverter { public object Convert( object value, Type targetType, object parameter, CultureInfo culture ) { var row = (IDictionary) value; var key = (ssortingng) parameter; return row.Keys.Contains( key ) ? row[ key ] : null; } public object ConvertBack( object value, Type targetType, object parameter, CultureInfo culture ) { throw new NotImplementedException( ); } } 

Lier à 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 requirejs pour que la source cible la liaison.

 public class BindableRow : INotifyPropertyChanged, IDictionary { private Dictionary _data = new Dictionary( ); public object Dummy // Provides a dummy property for the column to bind to { get { return this; } set { var o = value; } } public object this[ ssortingng index ] { get { return _data[ index ]; } set { _data[ index ] = value; InvokePropertyChanged( new PropertyChangedEventArgs( "Dummy" ) ); // Trigger update } } } 

Dans votre fichier .xaml, utilisez ce convertisseur. Faites d’abord référence à:

    

Ensuite, par exemple, si votre dictionnaire a une entrée où la clé est “Nom”, alors, pour l’y lier: utilisez

  

Rendez votre propriété “nom du vent” à DependencyProperty et conservez le même.

Dans votre code, définissez DataContext de la fenêtre sur le dictionnaire. Dans votre XAML, vous pouvez écrire:

  

Cela va lier le ListView au dictionnaire.

Pour des scénarios plus complexes, ce serait un sous-ensemble de techniques à l’origine du modèle MVVM .

Un moyen serait de créer un ObservableCollection (System.Collections.ObjectModel) et d’y placer vos données de dictionnaire. Ensuite, vous devriez être capable de lier ObservableCollection à votre ListBox.

Dans votre XAML, vous devriez avoir quelque chose comme ceci:

  

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 je devais définir un DataContext relatif que je venais d’append à la fenêtre XAML.

  

Vous pouvez essayer x: Astuce de référence