Oggetti vincolanti definiti in code-behind

Ho un object che viene istanziato nel codice, ad esempio, XAML si chiama window.xaml e all’interno di window.xaml.cs

protected Dictionary myDictionary; 

Come posso associare questo object, ad esempio, a una vista elenco, utilizzando solo i markup XAML?

Aggiornare:

(Questo è esattamente il mio codice di prova):

     

E in codebehind

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

Supponiamo che il titolo debba diventare “ABCDEFG” giusto? ma finisce per non mostrare nulla.

Puoi impostare DataContext per il tuo controllo, modulo, ecc. In questo modo:

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

Chiarimento :

Il contesto dei dati impostato sul valore sopra deve essere fatto a qualunque elemento “possieda” il codice, quindi per una finestra, devi impostarlo nella dichiarazione della finestra.

Ho il tuo esempio che lavora con questo codice:

  

Il set DataContext a questo livello viene ereditato da qualsiasi elemento della finestra (a meno che non lo si modifichi esplicitamente per un elemento figlio), quindi dopo aver impostato DataContext per la finestra si dovrebbe essere in grado di eseguire il binding diretto alle proprietà CodeBehind da qualsiasi controllo Sulla finestra.

C’è un modo molto più semplice per farlo. Puoi assegnare un Nome alla tua Finestra o UserControl e quindi bind per 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(); } } 

Mentre la risposta di Guy è corretta (e probabilmente si adatta a 9 casi su 10), vale la pena notare che se si sta provando a farlo da un controllo che ha già impostato DataContext più in alto nello stack, si ripristinerà questo quando si imposta DataContext di nuovo a se stesso:

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

Questo ovviamente spezzerà i tuoi binding esistenti.

In questo caso, è necessario impostare RelativeSource sul controllo che si sta tentando di associare, anziché sul relativo genitore.

vale a dire per il legame alle proprietà di un UserControl:

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

Dato quanto può essere difficile attualmente vedere cosa succede con l’associazione dei dati, vale la pena tener presente questo anche se si trova che l’impostazione RelativeSource={RelativeSource Self} attualmente funziona 🙂

Solo un piccolo chiarimento: una proprietà senza ‘get’, ‘set’ non potrà essere vincasting

Sto affrontando il caso proprio come il caso del richiedente. E devo avere le seguenti cose per far funzionare correttamente il bind:

 //(1) Declare a property with 'get','set' in code behind public partial class my_class:Window { public String 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-string-value"; InitializeComponent(); } //(3) Set data context in window xaml and specify a binding    

Definisci un convertitore:

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

Associare a una definizione personalizzata di un dizionario. Ci sono molte sostituzioni che ho omesso, ma l’indicizzatore è importante, perché emette l’evento modificato della proprietà quando il valore viene modificato. Questo è richiesto per l’associazione alla destinazione.

 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[ string index ] { get { return _data[ index ]; } set { _data[ index ] = value; InvokePropertyChanged( new PropertyChangedEventArgs( "Dummy" ) ); // Trigger update } } } 

Nel tuo file .xaml usa questo convertitore. Prima riferimento:

    

Quindi, ad esempio, se il tuo dizionario ha una voce in cui la chiave è “Nome”, quindi associare ad essa: utilizzare

  

Rendi la tua proprietà “windowname” una DependencyProperty e mantieni il rimanente stesso.

Nel tuo codice, imposta DataContext della finestra sul dizionario. Nel tuo XAML puoi scrivere:

  

Ciò collegherà il ListView al dizionario.

Per scenari più complessi, questo sarebbe un sottoinsieme di tecniche dietro il pattern MVVM .

Un modo sarebbe creare un ObservableCollection (System.Collections.ObjectModel) e avere i dati del dizionario lì dentro. Quindi dovresti essere in grado di associare ObservableCollection al tuo ListBox.

Nel tuo XAML dovresti avere qualcosa di simile a questo:

  

Stavo avendo lo stesso identico problema ma il mio non era perché stavo impostando una variabile locale … Ero in una finestra figlia, e avevo bisogno di impostare un DataContext relativo che ho appena aggiunto a Window XAML.

  

Puoi provare x: trucco di riferimento