Objetos vinculantes definidos en código subyacente

Tengo un objeto que se crea una instancia en código detrás, por ejemplo, el XAML se llama window.xaml y dentro de window.xaml.cs

protected Dictionary myDictionary; 

¿Cómo puedo vincular este objeto a, por ejemplo, una vista de lista, usando solo marcas de XAML?

Actualizar:

(Esto es exactamente lo que tengo en mi código de prueba):

     

Y en código subyacente

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

Supongamos que el título debe convertirse en “ABCDEFG” ¿verdad? pero termina mostrando nada.

Puede configurar DataContext para su control, formulario, etc. de la siguiente manera:

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

Aclaración :

El contexto de datos que se establece en el valor anterior se debe hacer en cualquier elemento “propietario” del código subyacente, por lo que para una ventana, debe establecerlo en la statement de ventana.

Tengo tu ejemplo trabajando con este código:

  

El DataContext establecido en este nivel es heredado por cualquier elemento de la ventana (a menos que lo cambies explícitamente por un elemento hijo), por lo que después de configurar el DataContext para la ventana deberías poder hacer un enlace directo a las propiedades de CodeBehind desde cualquier control en la ventana.

Hay una forma mucho más fácil de hacer esto. Puede asignar un nombre a su ventana o UserControl, y luego vincular por 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(); } } 

Si bien la respuesta de Guy es correcta (y probablemente se ajusta a 9 de cada 10 casos), vale la pena señalar que si intenta hacer esto desde un control que ya tiene su DataContext configurado más arriba en la stack, lo restablecerá cuando configure DataContext volver a sí mismo:

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

Esto, por supuesto, romperá tus enlaces existentes.

Si este es el caso, debe establecer RelativeSource en el control que está intentando vincular, en lugar de su padre.

es decir, para vincular las propiedades de UserControl:

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

Dado lo difícil que puede ser actualmente ver qué está pasando con el enlace de datos, vale la pena tener esto en cuenta, incluso si usted encuentra que el ajuste RelativeSource={RelativeSource Self} funciona actualmente 🙂

Solo un poco más de aclaración: una propiedad sin ‘get’, ‘set’ no podrá ser enlazada

Estoy enfrentando el caso al igual que el caso del asesino. Y debo tener las siguientes cosas para que el enlace funcione correctamente:

 //(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    

Definir un convertidor:

 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( ); } } 

Enlace a una definición personalizada de un diccionario. Hay muchas anulaciones que he omitido, pero el indexador es el más importante, porque emite el evento de propiedad cambiada cuando se cambia el valor. Esto es obligatorio para el enlace de origen a destino.

 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 } } } 

En su archivo .xaml use este convertidor. Primera referencia:

    

Entonces, por ejemplo, si su diccionario tiene una entrada donde la clave es “Nombre”, entonces para vincularse a ella: use

  

Haga que su propiedad “windowname” sea DependencyProperty y conserve el rest.

En su código, establezca el DataContext de la ventana en el diccionario. En tu XAML, puedes escribir:

  

Esto vinculará el ListView al diccionario.

Para escenarios más complejos, esto sería un subconjunto de técnicas detrás del patrón MVVM .

Una forma sería crear un ObservableCollection (System.Collections.ObjectModel) y tener sus datos de diccionario allí. Entonces deberías poder unir el ObservableCollection a tu ListBox.

En tu XAML deberías tener algo como esto:

  

Estaba teniendo exactamente este mismo problema, pero el mío no era porque estaba configurando una variable local … Estaba en una ventana secundaria, y necesitaba establecer un DataContext relativo que acabo de agregar a la ventana XAML.

  

Puede intentar x: truco de referencia