2011-09-05 16 views
8

Cómo vincular WPF a ItemsSource a una propiedad privada?Cómo vincular un ItemsSource a una propiedad privada

<ComboBox x:Name="xxx" ItemsSource="{Binding Items, Mode=OneWay}" 
      DisplayMemberPath="ItemName"/> 
public partial class ItemBuySellAddEdit : BasePage 
{ 
    private List<Item> Items { get; set; } 
} 

lista de productos que se rellenarán mientras se carga el formulario.

+0

público/interno funciona con enlace. – RainCast

Respuesta

20

DataBinding en WPF funciona solo con propiedades públicas.

MSDN:

Las propiedades que se utilizan las propiedades del origen de unión para una unión debe ser propiedades públicas de su clase. Explícitamente definidos interfaz propiedades no se puede acceder con fines de unión, ni pueden protegido, propiedades privadas, internas o virtuales que no tienen una base de aplicación

+0

incluso si lo haces público no funcionó. :( – sameera

+1

Use ObservableCollection en lugar de List

2

Esto no es posible, si se desea, se puede utilizar internal en su lugar.

... y usa ObservableCollection<T> y no olvides configurar el DataContext de la vista.

+6

En mi experiencia, incluso la accesibilidad interna es suficiente para romper el enlace de datos XAML y solo pueden vincularse las propiedades públicas. – Neutrino

1

Necesita una vinculación Fuente relativa, ahora su enlace es al DataContext de su ItemBuySellAddEdit (FrameworkElement) Al menos esa es mi Impresión, porque está usando partial. Si es un ViewModel, verifique la Ventana de salida y observe si tiene algún error de enlace.

<ComboBox 
    x:Name="xxx" 
    ItemsSource="{Binding Items, 
     RelativeSource={RelativeSource AncestorType={x:Type ItemBuySellAddEdit}}, 
     Mode=OneWay}" 
    DisplayMemberPath="ItemName"/> 

Pero la respuesta de Stephan Bauer sigue siendo válida.

También tenga en cuenta la respuesta de WaltiD si desea que los elementos nuevos en esa lista aparezcan automáticamente.

3

Si realmente deseaba hacer esto, debería proporcionar un descriptor de tipo personalizado, implementando ICustomTypeDescriptor, que proporciona la propiedad adicional a través de un PropertyDescriptor personalizado junto con las propiedades públicas normales. Puede implementar esta interfaz en el tipo en sí o a través del TypeDescriptionProvider; este último es el preferido, ya que funciona en más escenarios (cosas como listas vacías, sin necesidad de proporcionar también una lista personalizada con una implementación ITypedList). Este es un lote de trabajo, y realmente no vale la pena excepto en casos extremos. Pero puede hacerse.

Cuestiones relacionadas