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