Gracias a algunos de los consejos que he recibido anteriormente sobre Stack Overflow, he estado haciendo un buen progreso en mi comprensión de MVVM. Sin embargo, es cuando las cosas comienzan a ser más complicadas que todavía estoy luchando.MVVM WPF Master Detail Comboboxes
Tengo la siguiente vista que es con el propósito de ingresar pedidos. Está vinculado a un DataContext de OrderScreenViewModel.
<StackPanel>
<ComboBox Height="25" Width="100" DisplayMemberPath="CustomerCode" SelectedItem="{Binding Path=Order.Customer}" ItemsSource="{Binding Path=Customers}"></ComboBox>
<ComboBox Height="25" Width="100" DisplayMemberPath="ProductCode" SelectedItem="{Binding Path=CurrentLine.Product}" ItemsSource="{Binding Path=Products}"></ComboBox>
</StackPanel>
El primer cuadro combinado se utiliza para seleccionar un Cliente. El segundo cuadro combinado se utiliza para seleccionar un Código de producto para un nuevo OrderLine.
Hay los artículos que no puedo encontrar la manera de lograr en MVVM:
1) Cuando un cliente se selecciona actualizar los productos de cuadro combinado de modo que su origen de elementos sólo muestra los productos que tienen el mismo identificador de cliente como el CustomerDto registro seleccionado en el cuadro combinado
2) Cuando se llama a Load, establezca SelectedItem en el cuadro combinado Customers para que muestre al Cliente con CustomerId igual al del OrderDto.
3) Aplicar, el mismo proceso que 1) para que solo se muestren/carguen Productos pertenecientes a ese Cliente y establezca SelectedItem en el cuadro combinado Productos para que apunte a la entrada con el mismo ProductId que figura en el OrderLineD a
No estoy seguro de cómo proceder o incluso si tengo las responsabilidades de mis viewmodels correctos. Tal vez tiene algo que ver con NotifyPropertyChanged? Cualquier sugerencia sobre cómo puedo lograr lo anterior será muy apreciada. Estoy seguro de que si lo hago bien, me ayudará mucho en mi aplicación. Muchas gracias Alex.
public class OrderScreenViewModel
{
public WMSOrderViewModel Order { get; private set; }
public WMSOrderLineViewModel CurrentLine { get; private set; }
public OrderScreenViewModel()
{
Order = new WMSOrderViewModel();
CurrentLine = new WMSOrderLineViewModel(new OrderLineDto());
}
public void Load(int orderId)
{
var orderDto = new OrderDto { CustomerId = 1, Lines = new List<OrderLineDto> { new OrderLineDto{ProductId = 1 }} };
Order = new WMSOrderViewModel(orderDto);
}
public List<CustomerDto> Customers
{
get{
return new List<CustomerDto> {
new CustomerDto{CustomerId=1,CustomerCode="Apple"},
new CustomerDto{CustomerId=1,CustomerCode="Microsoft"},
};
}
}
public List<ProductDto> Products
{
get
{
return new List<ProductDto> {
new ProductDto{CustomerId=1,ProductId=1,ProductCode="P100",Description="Pepsi"},
new ProductDto{CustomerId=1,ProductId=2,ProductCode="P110",Description="Coke"},
new ProductDto{CustomerId=2,ProductId=3,ProductCode="P120",Description="Fanta"},
new ProductDto{CustomerId=2,ProductId=4,ProductCode="P130",Description="Sprite"}
};
}
}
public class WMSOrderLineViewModel
{
private ProductDto _product;
private OrderLineDto _orderLineDto;
public WMSOrderLineViewModel(OrderLineDto orderLineDto)
{
_orderLineDto = orderLineDto;
}
public ProductDto Product { get { return _product; }
set{_product = value; RaisePropertyChanged("Product"); }
}
public class WMSOrderViewModel
{
private ObservableCollection<WMSOrderLineViewModel> _lines;
private OrderDto _orderDto;
public ObservableCollection<WMSOrderLineViewModel> Lines { get { return _lines; } }
private CustomerDto _customer;
public CustomerDto Customer { get{return _customer;} set{_customer =value; RaisePropertyChanged("Customer") }
public WMSOrderViewModel(OrderDto orderDto)
{
_orderDto = orderDto;
_lines = new ObservableCollection<WMSOrderLineViewModel>();
foreach(var lineDto in orderDto.Lines)
{
_lines.Add(new WMSOrderLineViewModel(lineDto));
}
}
public WMSOrderViewModel()
{
_lines = new ObservableCollection<WMSOrderLineViewModel>();
}
}
Cuando dice LineaActual Orden y deben ser sólo un tipo qué se refiere como OrderDto? Con referencia a 1) eso es lo que pensé que tendría que hacer. Me siento un poco atascado ya que el colocador para el cliente está en WMSOrderViewModel y no tengo ninguna referencia a los productos en OrderScreenViewModel desde aquí. ¿Cómo puedo vincular esos dos elementos? – lostinwpf
Te contactaremos y crearemos un código de ejemplo –
para agregar un código. –