2012-02-03 43 views
1

我在使用MVVM时如何连接互连组合框时遇到了一些困难。我有一个DTO代表包含CustomerIdOrderTypeId的订单。然后这些包裹在OrderViewModel内。我也有一个EditOrderViewModel从数据库加载一个客户列表。
关于视图模型和互连组合框的建议

我想要做的是从数据库加载订单(类似于加载函数)在组合框中选择正确的项目(项目源是一个列表,显示所选客户的名称组合框右侧的文本块,最后在下一个组合框中加载属于该客户的OrderType列表,然后再次选择正确的OrderType并在右侧的TextBlock中显示OrderTypeName。

我设法当我从组合框中使用SelectedItem时,获得一些行为,但这只是当我手动选择项目时,因为我不知道如何在我的viewmodel中将Order.CustomerId(类型为int)转换为正确的SelectedItem(类型CustomerDTO )。下面是一些代码w这些内容大致显示了我在使用内存数据源时想实现的目标。谢谢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"); 
      } 
     } 
    } 
+0

也许尝试找到这样的CustomerDTO:Customers.FirstOrDefault(c => c.Id == Order.CustomerId),然后将您的SelectedItem绑定属性设置为。 – 2012-02-03 14:50:59

回答

0

请勿在您的XAML绑定中设置ComboBox.SelectedValue。您应该将ComboBox.SelectedItem绑定到您的模型,以便您可以轻松使用CustomDTO。您应该添加一个属性到您的OrderViewModel,名为Customer,类型为CustomerDTO),而不是尝试使用多个属性(CustomerID,CustomerName等)重新创建CustomerDTO。

+0

当你说'ComboBox.SelectedItem'应该在模型上时,你的意思是我应该在'EditOrderViewModel'或其他地方有一个属性'SelectedCustomer'?此外,CustomerDto纯粹用于在ComboBox中显示客户。如何让OrderDto上只有'CustomerId',我会在'OrderViewModel.Customer'中填充正确的值? Alex – lostinwpf 2012-02-03 16:08:55

+0

@lostinwpf - 您需要在ViewModel中绑定到'ComboBox.SelectedItem'的'SelectedCustomer'。对不起 - 我只是意识到你正在处理多个虚拟机 - 不只是一个。 – SliverNinja 2012-02-03 16:17:46