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
相关产品推荐
相关产品推荐

