Советы по ViewModel и взаимосвязанным комбинированным спискам - PullRequest
1 голос
/ 03 февраля 2012

У меня есть несколько трудностей с тем, как подключить мои взаимосвязанные списки при использовании MVVM.У меня есть DTO, который представляет ордер, который содержит CustomerId и OrderTypeId.Затем они обернуты внутри OrderViewModel.У меня также есть EditOrderViewModel, который загружает из базы данных список клиентов.

То, что я хотел бы сделать, это загрузить ордер из БД (аналогично функции загрузки), выбрать нужный элемент в ComboBox (источником элементов которого является список, отобразить имявыбранного клиента в текстовом блоке справа от поля со списком и, наконец, загрузите список типов заказов, принадлежащих этому клиенту, в следующем поле со списком и снова выберите правильный тип заказа и отобразите имя заказа в текстовом блоке справа.

Мне удалось заставить работать некоторое поведение, когда я использую SelectedItem из выпадающего списка, но это только когда я выбираю элемент вручную, так как я не уверен, как в моей модели просмотра я могу преобразовать Order.CustomerId (тип int) вправильный SelectedItem (тип CustomerDTO). Ниже приведен некоторый код, который показывает в целом то, что я пытаюсь достичь при использовании источников данных в памяти. Спасибо Alex

        <ComboBox Height="25" Width="150"  ItemsSource="{Binding Path=Customers}" SelectedValue="{Binding Path=Order.CustomerId}" SelectedValuePath="Id">
            <ComboBox.ItemTemplate>
                <DataTemplate>
                        <TextBlock Text="{Binding Path=Code}"></TextBlock>
                         <TextBlock Text="{Binding Path=Name}"></TextBlock>
                </DataTemplate>
            </ComboBox.ItemTemplate>
        </ComboBox>
        <TextBlock Text="{Binding Path=Name,Mode=OneWay,NotifyOnSourceUpdated=True}"></TextBlock>

public class EditOrderViewModel : VMBase
    {
        public OrderViewModel Order{get;set;}

        public void Load()
        {
            Order = new OrderViewModel(new OrderDto{CustomerId=1,OrderTypeId=2});
            Order.PropertyChanged += MainWindowViewModel_PropertyChanged;
        }

        public EditOrderViewModel()
        {
            Order = new OrderViewModel(new OrderDto());
            Order.PropertyChanged += OrderViewModel_PropertyChanged;

            Customers = new List<CustomerDto> {  
            new CustomerDto{ Id = 1, Code = "ACME", Name = "ACME CORP" }, 
            new CustomerDto{ Id = 2, Code = "MSFT", Name="MICROSOFT CORP" }, 
            new CustomerDto{ Id = 3, Code = "APP", Name = "APPLE" }};

            OrderTypes = new List<OrderTypeDto>{
                new OrderTypeDto{OrderTypeId=1, CustomerId =1, Name = "Cake Order"},
                new OrderTypeDto{OrderTypeId=2, CustomerId =1, Name = "Sandwich                 Order"},
                new OrderTypeDto{OrderTypeId=3, CustomerId =2, Name = "Chocolate Order"},
                new OrderTypeDto{OrderTypeId=4, CustomerId =2, Name = "Bread Order"},
                new OrderTypeDto{OrderTypeId=5, CustomerId =3, Name = "Drinks Order"}};
        }

        void OrderViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            switch (e.PropertyName)
            {
                case "OrderTypeId":
                    break;
                case "SelectedCustomer":
                    break;
                default:
                    break;
            }
        }

        public List<OrderTypeDto> OrderTypes { get; set; }
        public List<CustomerDto> Customers { get; set; }
    }

    public class OrderDto
    {
        public int CustomerId { get; set; }
        public int OrderTypeId { get; set; }
    }

    public class CustomerDto
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Code { get; set; }
    }

    public class OrderViewModel : VMBase
    {
        private OrderDto _orderDto;
        private string _customerName;

        public OrderViewModel(OrderDto orderDto)
        {
            _orderDto = orderDto;
        }

        public int CustomerId {
            get { return _orderDto.CustomerId; }
            set
            {
                _orderDto.CustomerId = value;
                RaisePropertyChanged("CustomerId");
            }
        }

        public string CustomerName    {
            get { return _customerName; }
            set {_customerName = value; 
                RaisePropertyChanged("CustomerName");
            }
        }

        public int OrderTypeId
        {
            get { return _orderDto.OrderTypeId; }
            set
            {
                _orderDto.OrderTypeId = value;
                RaisePropertyChanged("OrderTypeId");
            }
        }
    }

1 Ответ

0 голосов
/ 03 февраля 2012

Не устанавливайте ComboBox.SelectedValue в привязке XAML. Вы должны привязать ComboBox.SelectedItem к вашей модели, чтобы вы могли легко получить CustomDTO. Вы должны добавить свойство в свою OrderViewModel с именем Customer ( типа CustomerDTO ) вместо попытки воссоздания CustomerDTO с использованием нескольких свойств ( CustomerID, CustomerName и т. Д. ).

...