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

WinUI 3中自定义ItemTemplate的ComboBox绑定Type数组崩溃问题

WinUI3 ComboBox绑定Type数组崩溃的解决方法

直接将Type类型数组作为ComboBox的ItemsSource会触发未处理异常,原因是XAML在渲染下拉列表或处理选择逻辑时,无法正确处理Type类型的内部反射属性(存在序列化或访问权限相关问题)。

解决方法是通过包装类封装Type对象,仅暴露需要展示的属性给XAML绑定:

1. 定义Type包装类

创建一个简单的包装类,将Type的必要属性(如Name)单独暴露:

public class TypeWrapper
{
    public Type Type { get; }
    public string Name { get; }

    public TypeWrapper(Type type)
    {
        Type = type;
        Name = type.Name;
    }
}

2. 修改后台代码替换数据源

用TypeWrapper数组替代原有的Type数组作为ComboBox的数据源:

using Microsoft.UI.Xaml.Controls;
using System;

namespace RayMarchEditor
{
    public sealed partial class ChooseObjectTypePage : Page
    {
        public ChooseObjectTypePage()
        {
            this.InitializeComponent();

            comboBox.ItemsSource = new TypeWrapper[] { new TypeWrapper(typeof(string)) };
        }
    }
}

3. 保留原XAML代码不变

原有的ItemTemplate绑定Name属性无需修改,因为TypeWrapper已经提供了该属性:

<Page
    x:Class="RayMarchEditor.ChooseObjectTypePage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

    <ComboBox x:Name="comboBox" HorizontalAlignment="Stretch">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Name, Mode=OneTime}"/>
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>
</Page>

这样处理后,ComboBox可以正常渲染下拉列表,设置SelectedIndex也不会触发崩溃。需要获取选中的Type对象时,只需从选中的TypeWrapper实例的Type属性读取即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 19:46:17