You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Avalonia应用中ComboBox无法填充数据问题求助

Avalonia ComboBox 数据不显示问题分析与修复方案

核心问题1:无参构造函数未初始化集合

XAML中直接实例化的TerminalConfigureViewModel使用了无参构造函数,但该构造函数未初始化_siteIds和_terminals集合,导致SiteIds、Terminals属性返回null,UI无法绑定到数据。

修复代码:

public TerminalConfigureViewModel()
{
    _siteIds = [];
    _terminals = [];
}

核心问题2:ComboBox ItemTemplate 错误嵌套容器

ComboBox内部会自动为每个列表项生成ComboBoxItem容器,手动在DataTemplate中嵌套ComboBoxItem会破坏视觉树结构,导致内容无法正常显示。

修复XAML代码(两个ComboBox都需修改):

<!-- Site ID ComboBox 修改后 -->
<ComboBox
    Classes="Configure"
    Width="296"
    Margin="10 5 5 10"
    ItemsSource="{Binding SiteIds}"
    SelectedItem="{Binding SiteId, Mode=TwoWay}">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding SiteId}" />
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

<!-- Device ComboBox 修改后 -->
<ComboBox
    Classes="Configure"
    Width="296"
    Margin="10 5 5 10"
    ItemsSource="{Binding Terminals}"
    SelectedItem="{Binding Terminal}">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding DeviceName}" />
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

核心问题3:SiteId 属性Setter逻辑冗余且错误

Setter中先直接给_siteId赋值,再调用RaiseAndSetIfChanged,此时_siteId已等于目标值,属性变更通知不会触发,导致UI无法感知数据变化。

修复代码:

public SiteIdModel? SiteId
{
    get => _siteId;
    set
    {
        if (this.RaiseAndSetIfChanged(ref _siteId, value))
        {
            this.RaisePropertyChanged(nameof(Terminals));
            _terminals!.Clear();
            await GetNewTerminalList();
        }
    }
}

核心问题4:异步方法使用async void导致潜在异常

Activate和GetNewTerminalList使用async void,会导致异步操作的异常无法被捕获,还可能引发UI更新时机问题,需改为async Task。

修复代码:

public async Task Activate()
{
    _siteIds!.AddRange(await GetSiteIdListAsync());
    SiteId = _siteIds![0];
    Terminal = _terminals![0];
}

private async Task GetNewTerminalList()
{
    var query = new ListDevicesBySiteIdQuery(_siteId!.SiteId!);
    var queryResult = await _mediator!.Send(query);

    var terminals = new List<TerminalModel>();
    foreach (var result in queryResult.Value)
    {
        terminals.Add(new TerminalModel(
            result.Site!.SiteNumber,
            result.TerminalName));
    }

    _terminals!.AddRange(terminals);
    Terminal = _terminals![0];
}

调用Activate的修改(在View的构造函数中):

public TerminalConfigureView()
{
    InitializeComponent();
    if (DataContext is TerminalConfigureViewModel vm)
    {
        Loaded += async (s, e) => await vm.Activate();
    }
}

内容的提问来源于stack exchange,提问作者Harlan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 03:42:54