2010-03-24 10 views
13

Tengo un WPF ListBox que me gustaríaenlace de datos de un ListBox con SelectionMode = Múltiple

  • Activar la selección múltiple en el ListBox y
  • databind el ListBox a mi modelo de vista.

Estos dos requisitos parecen ser incompatibles. Mi modelo de vista tiene una propiedad ObservableCollection<T> para enlazar a este ListBox; Configuré un enlace en XAML desde la propiedad a la propiedad ListBox.SelectedItems. Cuando compilé, recibí un error que decía que la propiedad SelectedItems era de solo lectura y no se podía configurar desde XAML.

¿Estoy vinculando a la propiedad de control incorrecta? ¿Hay alguna manera de vincular un ListBox de selección múltiple en XAML a una propiedad de colección de modelos de vista? Gracias por tu ayuda.

Respuesta

6

Terminé usando un poco de código subyacente en un controlador de eventos SelectionChanged para establecer la propiedad del modelo de vista. Más simple que crear envoltorios de objetos.

21

Lo que puede hacer para evitar esto:

Crear una propiedad IsSelected en los artículos que esté mostrando en la lista. Supongo que estos están representados por un modelo de vista también. Por lo tanto, no debería ser un drama agregar una propiedad extra. Si solo son objetos de negocios, considere usar una clase de envoltura para envolverlos sin dolor en los elementos del modelo de visualización (el conector descarado - here es uno de esos sistemas. Lo uso a diario para ajustar mis objetos comerciales)

Use un estilo de contenedor de elementos para enlazar la propiedad IsSelected del elemento del cuadro de lista a la propiedad IsSelected de los artículos que visualizas, al igual que

<ListBox.ItemContainerStyle> 
     <!-- This Style binds a ListBoxItem to a the ViewModelItem. --> 
     <Style 
      TargetType="{x:Type ListBoxItem}"> 
      <Setter 
      Property="IsSelected" 
      Value="{Binding IsSelected, Mode=TwoWay}" /> 
     </Style> 
    </ListBox.ItemContainerStyle> 

(podría necesitar un basado en el atributo en el estilo, no estoy seguro)

Ahora cada vez una lista el elemento de la caja se selecciona su modelo de vista lo sabrá y puede actualizar su c interna elección según sea necesario.

+0

Deseo que haya incluido el código de viewmodel ... No estoy seguro de qué tipo de datos se deben usar en la propiedad. – barrypicker

+0

La propiedad IsSelected es un booleano. –

+0

Es una solución muy buena. Por si acaso, por una cuadrícula de datos, el XAML es: ... Guillaume

0

He publicado una técnica para permitir un enlace de solo lectura a la propiedad SelectedItems de un WGT DataGrid simplemente ampliando el DataGrid que creo que podría ser fácilmente cooptado para un ListBox. Puede ver mi publicación en https://stackoverflow.com/a/16953833/62278

Cuestiones relacionadas