c# - Lista de selección de Linq de ObservableCollection con diferentes modelos en WPF

CorePress2024-01-25  88

Escenario: Tengo dos Datagrid que se unen a ObservableCollection<Product> ProductList y ObservableCollection<ProductQuantity> Lista de cantidades. Me gustaría seleccionar y agregar List<ProductQuantity> Stock de ObservableCollection<Product> ProductList donde ProductList.id == SelectedProduct.id a la nueva ObservableCollection<ProductQuantity> Lista de cantidades. Entonces, cada vez que el usuario seleccione una fila de ProductList, CantidadList se actualizará según la fila seleccionada.

Modelo (Producto.cs)

public class Product : ObservableObject
{
    public int Id { get; set; }

    public string Product_no { get; set; }

    public List<ProductQuantity> Stock { get; set; }
}

public class ProductQuantity : ObservableObject
{
    public string Branch_name { get; set; }

    public float Quantity { get; set; }
}

ViewModel (ProductViewModel.cs)

public class ProductViewModel : ViewModelBase
{
    public ProductViewModel()
    {
        searchCommand = new RelayCommand(Search);

        SelectedProduct = new Product();
    }

    #region Define
    private ObservableCollection<Product> productList;
    public ObservableCollection<Product> ProductList
    {
        get { return productList; }
        set { productList = value; OnPropertyChanged("ProductList"); }
    }

    private ObservableCollection<ProductQuantity> quantityList;
    public ObservableCollection<ProductQuantity> QuantityList
    {
        get { return quantityList; }
        set { quantityList = value; OnPropertyChanged("QuantityList"); }
    }

    private Product selectedProduct;
    public Product SelectedProduct
    {
        get { return selectedProduct; }
        set
        { 
            selectedProduct = value;
            OnPropertyChanged("SelectedProduct");
            LoadProductQuantity();
        }
    }
    #endregion


    #region CustomOperation
    private void LoadProductQuantity()
    {
        if (ProductList != null)
        {
            // here
            QuantityList = new ObservableCollection<ProductQuantity>((List<ProductQuantity>)ProductList.Where(e => e.Id == SelectedProduct.Id).Select(s => s.Stock));
        }
    }
    #endregion


    #region SearchOperation
    private RelayCommand searchCommand;
    public RelayCommand SearchCommand
    {
        get { return searchCommand; }
    }
    private async void Search()
    {
        try
        {
            
            RootProductObject Response = await GetProductListAPI();
                

            //datagrid
            ProductList = new ObservableCollection<Product>(Response.Data.OrderBy(property => property.Id));
            
        }
        catch (Exception e)
        {
            //
        }
    }
    #endregion

Json de la API backend (express.js)

"data": [
    {
        "id": 1,
        "product_no": "a000001",
        "stock": [
            {
                "branch_name": "US Branch",
                "quantity": 3.1
            },
            {
                "branch_name": "India Branch",
                "quantity": 3.1
            },
            {
                "branch_name": "Russia Branch",
                "quantity": 0
            }
        ]
    },
    {
        "id": 3,
        "product_no": "a000003",
        "stock": [
            {
                "branch_name": "US Branch",
                "quantity": 3.9
            },
            {
                "branch_name": "India Branch",
                "quantity": 3.2
            },
            {
                "branch_name": "Russia Branch",
                "quantity": 0
            }
        ]
    }
]

Error: Se produjo una excepción: 'System.InvalidCastException' en MyProject.dll. Se produjo una excepción de tipo 'System.InvalidCastException' en MyProject.dll pero fueno manejado en el código de usuario. No se puede convertir el objeto de tipo 'WhereSelectEnumerableIterator2[MyProject.Models.Product,System.Collections.Generic.List1[MyProject.Models.ProductQuantity]]' para escribir 'System.Collections.Generic.List`1[MyProject.Models.ProductQuantity] '.

¿De dónde sacas la excepción? ¿Puedes mostrar el código por favor?

- Serge

28/03/2021 a las 17:47

eliminar encasillamiento (List<ProductQuantity>) de (List<ProductQuantity>)ProductList.Where(e => e.Id == SelectedProduct.Id).Select(s => s.Stock). ObservableCollection tiene sobrecarga de constructor con IEnumerable

- ceniza

28/03/2021 a las 17:48

@Sergey Recibo la excepción en la línea de código después del comentario (// aquí) en ViewModel

- Chris

28/03/2021 a las 17:52

@ASh Después de eliminar el encasillado, aparece este error: Error CS1503 Argumento 1: no se puede convertir desde 'System.Collections.Generic.IEnumerable<System.Collections.Generic.List<MyProject.Models.ProductQuantity> ;>' a 'System.Collections.Generic.IEnumerable<MyProject.Models.ProductQuantity>' MiProyecto C:\Proyectos\MiProyecto\ViewModels\ProductViewModel.cs 92 Activo

- Chris

28/03/2021 a las 17:56

@Chris Consulta mi respuesta actualizada

– Serge

28/03/2021 a las 18:04



------------------------------------

private void LoadProductQuantity()
{
    if (ProductList != null)
    {
        var product = ProductList.FirstOrDefault(e => e.Id == SelectedProduct.Id);
        if (product != null)
            QuantityList = new ObservableCollection<ProductQuantity>(product.Stock);
        else
            QuantityList = new ObservableCollection<ProductQuantity>();
    }
}

1

Diría que esta es la respuesta exacta que podría resolver completamente mi problema, muchas gracias.

- Chris

28/03/2021 a las 18:30



------------------------------------

Solo prueba esto:

 QuantityList = new ObservableCollection<ProductQuantity>
( 
ProductList.Where(e => e.Id == SelectedProduct.Id)
.Select(s => s.Stock)
.FirstOrDefault()
);

1

Este código también funciona para mí, pero la respuesta de @ASh es la que más se adapta a mis casos de uso. De todos modos, ¡¡gracias por tu ayuda también!!

- Chris

28/03/2021 a las 18:38

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare