gpt4 book ai didi

wpf - 关于 View 模型和互连组合框的建议

转载 作者:行者123 更新时间:2023-12-03 10:49:47 24 4
gpt4 key购买 nike

在使用 MVVM 时,我在如何连接互连的组合框方面遇到了一些困难。我有一个 DTO,它代表一个包含 CustomerId 的订单和 OrderTypeId .然后将它们包裹在 OrderViewModel 中.我还有一个 EditOrderViewModel它从数据库加载客户列表。

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

当我从组合框中使用 SelectedItem 时,我已经设法使某些行为起作用,但这仅在我手动选择该项目时,因为我不确定如何在我的 View 模型中将 Order.CustomerId(类型 int)转换为正确的SelectedItem(类型 CustomerDTO)。下面是一些代码,一般显示了我在使用内存数据源时想要实现的目标。谢谢亚历克斯

        <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");
}
}
}

最佳答案

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

关于wpf - 关于 View 模型和互连组合框的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9130113/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com