Grazie ad alcuni dei consigli che ho ricevuto in precedenza su Stack Overflow, ho compiuto notevoli progressi nella comprensione di MVVM. Tuttavia, è quando le cose cominciano a diventare più complicate che sto ancora lottando.MVVM WPF Dettagli principali Combobox
Ho la vista qui sotto che è per lo scopo di inserire ordini. È associato a un DataContext di 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>
La prima casella combinata viene utilizzata per selezionare un cliente. La seconda casella combinata viene utilizzata per selezionare un ProductCode per una nuova OrderLine.
Ci sono le voci che non riesco a capire come ottenere in MVVM:
1) quando un cliente si seleziona aggiornare i prodotti casella combinata in modo che la sua fonte voce mostra solo i prodotti che hanno la stessa CustomerId come il CustomerDto record selezionato nella casella combinata
2) Quando viene chiamato Carica l'oggetto selezionato nella casella combinata Clienti in modo che visualizzi il cliente con l'ID cliente uguale a quello sul OrderDto.
3) Applicare, lo stesso processo di 1) in modo che solo i Prodotti appartenenti a quel Cliente siano visualizzati/caricati e impostare l'Oggetto Selezionato sulla casella combinata Prodotti in modo che punti alla voce con la stessa ID Prodotto come è contenuta in the OrderLineDto
Non sono sicuro di come procedere o anche se ho corretto le responsabilità dei miei modelli di visualizzazione. Forse ha qualcosa a che fare con NotifyPropertyChanged? Qualsiasi suggerimento su come posso ottenere quanto sopra sarà molto apprezzato. Sono sicuro che se avrò ragione mi aiuterà molto nella mia app. Mille grazie, 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>();
}
}
Quando si dice Ordine e CurrentLine dovrebbe essere solo un tipo si fa a dire come OrderDto? Con riferimento a 1) è quello che pensavo avrei dovuto fare. Mi blocco un po 'perché il setter per il cliente è su WMSOrderViewModel e non ho alcun riferimento ai prodotti su OrderScreenViewModel da qui - come faccio a collegarli insieme? – lostinwpf
Tornerà da te e costruirà il codice di esempio –
aggiunto del codice per iniziare. –