MVVM WPF Master Detail Comboboxes

Благодаря некоторым советам, которые я получил ранее по Stack Overflow, я добился хороших успехов в моем понимании MVVM. Однако когда все начинает усложняться, я все еще борюсь.

У меня есть изображение ниже, предназначенное для ввода приказов. Он привязан к DataContext из 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>

Первое поле со списком используется для выбора клиента. Второе поле со списком используется для выбора ProductCode для новой строки заказа.

Есть элементы, которые я не могу понять, как достичь в MVVM:
1) Когда выбран клиент, обновите поле со списком «Продукты», чтобы в его источнике элемента отображались только те продукты, которые имеют тот же идентификатор клиента, что и Запись CustomerDto выбрана в поле со списком
2) При вызове Load установите SelectedItem в поле со списком клиентов, чтобы он отображал клиента с CustomerId, равным значению в OrderDto.
3) Применить, тот же процесс, что и 1), чтобы отображались / загружались только Продукты, принадлежащие этому Клиенту, и установите SelectedItem в поле со списком «Продукты» так, чтобы он указывал на запись с тем же ProductId, что и содержится в OrderLineDto

, я не уверен, что делать дальше, и даже правильно ли я правильно понял обязанности моих моделей просмотра. Может, это как-то связано с NotifyPropertyChanged? Будем очень признательны за любые указания о том, как я могу достичь вышеуказанного. Я уверен, что если я правильно это сделаю, это очень поможет мне в моем приложении. Большое спасибо Алекс.

 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>();
        }
    }
5
задан lostinwpf 7 February 2012 в 23:01
поделиться