Wpf 关于viewmodel和互连组合框的建议

Wpf 关于viewmodel和互连组合框的建议,wpf,mvvm,combobox,prism,Wpf,Mvvm,Combobox,Prism,在使用MVVM时,我在如何连接互连的组合框方面遇到了一些困难。我有一个DTO,它表示一个订单,其中包含一个CustomerId和一个OrderTypeId。然后将这些文件包装在一个OrderViewModel中。我还有一个EditOrderViewModel,它从db加载客户列表 我想做的是从DB加载一个订单(类似于加载函数),在组合框中选择正确的项(项目源为列表,在组合框右侧的文本块中显示所选客户的名称,最后在下一个组合框中加载属于该客户的订单类型列表,然后再次选择正确的订单类型,并在右侧的文

在使用MVVM时,我在如何连接互连的组合框方面遇到了一些困难。我有一个DTO,它表示一个订单,其中包含一个
CustomerId
和一个
OrderTypeId
。然后将这些文件包装在一个
OrderViewModel
中。我还有一个
EditOrderViewModel
,它从db加载客户列表

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

当我从组合框中使用SelectedItem时,我已经设法使一些行为起作用,但这只是在我手动选择项目时,因为我不确定如何在viewmodel中将Order.CustomerId(type int)转换为正确的SelectedItem(type 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");
            }
        }
    }

公共类EditOrderViewModel:VMBase
{
public OrderViewModel订单{get;set;}
公共空荷载()
{
Order=neworderviewmodel(neworderdto{CustomerId=1,OrderTypeId=2});
Order.PropertyChanged+=MainWindowViewModel\u PropertyChanged;
}
public EditOrderViewModel()
{
Order=neworderviewmodel(neworderdto());
Order.PropertyChanged+=OrderViewModel\u PropertyChanged;
客户=新列表{
新客户到{Id=1,Code=“ACME”,Name=“ACME CORP”},
新客户地址{Id=2,Code=“MSFT”,Name=“MICROSOFT CORP”},
新客户到{Id=3,Code=“APP”,Name=“APPLE”};
OrderTypes=新列表{
新OrderTypeDto{OrderTypeId=1,CustomerId=1,Name=“Cake Order”},
新OrderTypeDto{OrderTypeId=2,CustomerId=1,Name=“三明治订单”},
新OrderTypeDto{OrderTypeId=3,CustomerId=2,Name=“Chocolate Order”},
新OrderTypeDto{OrderTypeId=4,CustomerId=2,Name=“面包订单”},
新OrderTypeDto{OrderTypeId=5,CustomerId=3,Name=“饮料订单”};
}
void OrderViewModel\u PropertyChanged(对象发送方,PropertyChangedEventArgs e)
{
开关(如PropertyName)
{
案例“OrderTypeId”:
打破
案例“SelectedCustomer”:
打破
违约:
打破
}
}
公共列表医嘱类型{get;set;}
公共列表客户{get;set;}
}
公共类OrderDto
{
public int CustomerId{get;set;}
public int OrderTypeId{get;set;}
}
公共类CustomerDto
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共字符串代码{get;set;}
}
公共类OrderViewModel:VMBase
{
私人订单到(u OrderDto);;
私有字符串\u客户名称;
public OrderViewModel(OrderDto OrderDto)
{
_orderDto=orderDto;
}
公共int客户ID{
获取{return\u orderDto.CustomerId;}
设置
{
_orderDto.CustomerId=值;
RaisePropertyChanged(“CustomerId”);
}
}
公共字符串客户名称{
获取{return\u customerName;}
设置{u customerName=value;
RaisePropertyChanged(“客户名称”);
}
}
公共整型OrderTypeId
{
获取{return\u orderDto.OrderTypeId;}
设置
{
_orderDto.OrderTypeId=值;
RaisePropertyChanged(“OrderTypeId”);
}
}
}

不要在XAML绑定中设置
组合框。SelectedValue
应将
组合框绑定。SelectedItem
应绑定到您的模型,以便可以轻松获得自定义数据。您应向OrderViewModel添加一个名为
Customer
的属性(类型为CustomerTo)不要尝试使用多个属性(CustomerID、CustomerName等)重新创建CustomerTo。

也许可以尝试查找CustomerTo,如下所示:Customers.FirstOrDefault(c=>c.Id==Order.CustomerID),然后将您的SelectedItem绑定属性设置为该属性。当您说“组合框”。SelectedItem应该在模型上,您的意思是我应该在
EditOrderViewModel
上或其他地方有一个属性
SelectedCustomer
。另外,
CustomerTo
纯粹是用于在组合框中显示客户。我是如何设置的如果订单上有
CustomerId
,我会在
OrderViewModel.Customer
中填充正确的值吗?Alex@lostinwpf-在绑定到组合框的ViewModel中,您确实需要一个
SelectedCustomer
。SelectedItem。抱歉-我刚刚意识到您正在处理多个虚拟机,而不仅仅是一个。