在 WPF ComboBox 中遇到紅色邊框出現然后很快消失的問題,如下所示:

主要問題似乎是為 ComboBox 加載 ViewModel 的時間。我試圖在我的 MVVM 設計中使用異步/等待方法。我遵循了一個使用 Prism 通過其事件聚合器發布和訂閱事件的示例。
ContractEditViewModel.cs
這是包含下拉資料的 ViewModel
public class ContractEditViewModel : Observable, IContractEditViewModel
{
private readonly ICoreRepository _coreRepository;
private readonly IEventAggregator _eventAggregator;
private CoreContract _contract;
private IEnumerable<CoreCarrier> _carriers;
public CoreContract Contract
{
get => _contract;
set
{
_contract = value;
OnPropertyChanged();
}
}
public IEnumerable<CoreCarrier> CarrierLookup
{
get { return _carriers; }
set
{
_carriers = value;
OnPropertyChanged();
}
}
public ContractEditViewModel(ICoreRepository coreRepository, IEventAggregator eventAggregator)
{
_coreRepository = coreRepository;
_eventAggregator = eventAggregator;
_eventAggregator.GetEvent<OpenContractEditViewEvent>()
.Subscribe(OnOpenContractView);
}
public async Task LoadAsync(int ContractId)
{
CarrierLookup = await _coreRepository.GetAllCarriersAsync();
Contract = await _coreRepository.FindContractByIdAsync(ContractId);
}
private async void OnOpenContractView(int contractId)
{
await LoadAsync(contractId);
}
}
ContractEditView.xaml
<UserControl x:Class="Contracts.Views.ContractEditView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:viewmodels="clr-namespace:Contracts.ViewModels"
d:DataContext="{d:DesignInstance Type=viewmodels:ContractEditViewModel}"
mc:Ignorable="d">
<ComboBox ItemsSource="{Binding CarrierLookup}"
DisplayMemberPath="DisplayValue"
SelectedValuePath="Id"
SelectedValue="{Binding Contract.CarrierId, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Margin="4" VerticalAlignment="Center"/>
</UserControl>
導航視圖模型.cs
此視圖模型表示具有資料網格的左側部分。我省略了資料網格和它自己的 LoadAsync() 的代碼以保持示例簡短。
public class NavigationViewModel : Observable
{
// other members omitted for brevity
private CoreContract _selectedContract;
public CoreContract SelectedContract
{
get { return _selectedContract; }
set
{
_selectedContract= value;
OnPropertyChanged();
if (_selectedContract != null)
{
_eventAggregator.GetEvent<OpenContractEditViewEvent>()
.Publish(_selectedContract.ContractId);
}
}
}
}
Task.Delay我可以通過在方法中包含 a 來加劇問題LoadAsync()。另一個有趣的事情是,在選擇第二個專案后,CombBox 周圍只有一個紅色邊框,而不是第一個:
public async Task LoadAsync(int ContractId)
{
CarrierLookup = await _coreRepository.GetAllCarriersAsync();
await Task.Delay(TimeSpan.FromSeconds(1));
Contract = await _coreRepository.FindContractByIdAsync(ContractId);
}

在我看來,這更像是 ComboBox 控制元件的問題,而不是異步/等待。有人對我面臨的這個困境有什么建議嗎?開始失去我的彈珠。
uj5u.com熱心網友回復:
在深入研究之后,ContractId 是一個整數的問題。我增加了等待時間,并使用這個答案來幫助查看工具提示中發生了什么,這給了我錯誤訊息"Value '' could not be converted."。因此,系結在 Task 完成之前接收到一個空值,并且它接收到其中包含 CarrierId 的選定合同。
如果我將CoreContract模型更新CarrierId為可以為空的整數int?,紅色框就會消失。讓我感到困惑的是,為什么在單擊資料網格行后但在合同完成加載之前第一次沒有出現紅框。誰能解釋一下?
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/489041.html
