C# WPF ComboBox: permite que el elemento se seleccione solo una vez por lista

Uso C#, WPF y trato de usar MVVM. Entonces tengo una ObservableCollection de MyObjects. La lista se representa en un DataGrid, y una propiedad de MyObject es una lista estática de elementos que se muestra en ComboBoxes en cada fila.

Ahora me gustaría seleccionar un elemento en una fila en este cuadro combinado, y si se seleccionó en otra fila antes, la última selección debe eliminarse al valor predeterminado. ¿Cómo puedo manejar esto? Mi MyObjectViewModel conoce el cambio de su "propio" cuadro combinado, pero ¿cómo puede decirle a MainViewModel (que contiene la ObservableCollection de MyObjects) que cambie el último elemento ComboBox seleccionado de otro objeto MyObject?

preguntado el 22 de mayo de 12 a las 09:05

Dijiste que la lista es estática, ¿verdad? Entonces, ¿no debería poder simplemente eliminar el elemento seleccionado y se actualizará para todas las filas automáticamente? -

No quiero que se elimine de la lista; si todavía hay otro ComboBox que se seleccionó con este elemento antes, esta selección de ComboBox debe eliminarse. -

¿Por qué no utiliza una lista para todos los elementos "AllItems", una para los elementos seleccionados "SeledtedItems" y una tercera con los elementos disponibles "AvailableItems", siendo este último un cálculo de "AllItems" menos "SelectedItems". Esta lista es la que vincula a los ItemsSource de sus ComboBoxes. Cada vez que "SelectedItems" cambia, también se activa NotifyPropertyChanged en "AvailableItems". -

@SvenG Pero si está vinculado a "Elementos disponibles", eso eliminaría el elemento seleccionado del cuadro combinado en cada fila. Creo que Op está diciendo que si se selecciona un elemento, debe permanecer allí en esa fila. -

@SvenG tal vez si tuviera una tercera propiedad en cada fila, "SelectedItem", y la agregara al enlace de "AvailableItems". -

1 Respuestas

La mejor manera de hacer esto es cambiar su enfoque de enlace a ListCollectionViews, ya que esto le permitirá administrar el cursor. A continuación se muestra un ejemplo:

Ver modelo

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Data;

    namespace BindingSample
    {
        public class ViewModel
        {
            private string[] _items = new[] { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" };

            public ViewModel()
            {
                List1 = new ListCollectionView(_items);
                List2 = new ListCollectionView(_items);
                List3 = new ListCollectionView(_items);

                List1.CurrentChanged += (sender, args) => SyncSelections(List1);
                List2.CurrentChanged += (sender, args) => SyncSelections(List2);
                List3.CurrentChanged += (sender, args) => SyncSelections(List3);
            }

            public ListCollectionView List1 { get; set; }

            public ListCollectionView List2 { get; set; }

            public ListCollectionView List3 { get; set; }

            private void SyncSelections(ListCollectionView activeSelection)
            {
                foreach (ListCollectionView view in new[] { List1, List2, List3 })
                {
                    if (view != activeSelection && view.CurrentItem == activeSelection.CurrentItem)
                        view.MoveCurrentTo(null);
                }
            }
        }
    }

Vea

<Window x:Class="ContextMenuSample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <StackPanel Orientation="Vertical">
        <ListBox ItemsSource="{Binding List1}" />
        <ListBox ItemsSource="{Binding List2}" />
        <ListBox ItemsSource="{Binding List3}" />        
    </StackPanel>
</Window>

Esto le permitirá tener solo un elemento seleccionado. Está codificado de forma rígida por ahora, pero se puede hacer más flexible fácilmente para listas adicionales.

contestado el 23 de mayo de 12 a las 12:05

Gracias por su respuesta, pero siguiendo su camino necesitaría la misma lista en cada objeto. ¿No es posible hacer esto con una lista estática (una lista para todos los objetos)? - iop

Solo hay una lista real, como se define en la variable _items. List1, List2 y List3 son solo vistas de esta fuente de datos estática. - Mark Green

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.