Grz*_*rzM 0 wpf binding combobox selecteditem mvvm
我无法理解组合框的行为。
我有一个编辑视图来编辑现有的订单数据。这是我的部分订单数据的 VM:
public class OrderDataViewModel : ViewModelBase, IOrderDataViewModel
{
private readonly ICustomersListProviderService _customersListProviderService;
private readonly Order _order;
public OrderDataViewModel(Order order, ICustomersListProviderService customersListProviderService)
{
Assign.IfNotNull(ref _order, order);
Assign.IfNotNull(ref _customersListProviderService, customersListProviderService);
}
public DateTime CreationDate
{
get { return _order.CreationDate ?? (_order.CreationDate = DateTime.Now).Value; }
set
{
if (_order.CreationDate == value) return;
_order.CreationDate = value;
OnPropertyChanged();
}
}
public Customer Customer
{
get { return _order.Customer; }
set
{
if (_order.Customer == value) return;
_order.Customer = value;
OnPropertyChanged();
}
}
private IList<Customer> _customersList;
public IList<Customer> CustomersList
{
get { return _customersList ?? (_customersList = _customersListProviderService.GetAllCustomers().ToList()); }
}
}
Run Code Online (Sandbox Code Playgroud)
和 XAML 绑定:
<ComboBox Grid.Row="2" Grid.Column="1"
SelectedItem="{Binding OrderDataViewModel.Customer}"
DisplayMemberPath="Name"
ItemsSource="{Binding OrderDataViewModel.CustomersList}"
/>
Run Code Online (Sandbox Code Playgroud)
描述。订单来自 Repository 的数据库,_customersListProviderService 也从数据库中获取所有客户。我知道也许它可以做得更好,但这不是问题的重点。
而且……问题是。加载窗口后,我的组合框填充了项目集合(下拉列表不为空)但未设置值(为空)。通过带有 null 的代码隐藏结果检查 SelectedItem。我读了很多,发现你不能将组合框的 SelectedItem 设置为不在 ItemsSource 中的项目。
好的,我的解决方法是将 Customer getter 更改为:
public Customer Customer
{
get
{ return CustomersList.Single(c => c.Id == _order.Customer.Id); }
set
{
if (_order.Customer == value) return;
_order.Customer = value;
OnPropertyChanged();
}
}
Run Code Online (Sandbox Code Playgroud)
现在它有效,但对我来说看起来不太好。
有没有更好的解决办法?
| 归档时间: |
|
| 查看次数: |
4497 次 |
| 最近记录: |