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