组合框与自定义ItemTemplate崩溃



我正在编写一个WinUI 3应用程序,并正在制作一个对话框,用户可以在其中选择多种对象类型之一。

对于组合框的ItemTemplate,我使用了一个TextBlock,其Text绑定到Name属性(以显示类型的名称(。

但是,如果我将ItemsSource设置为Type的数组,则在打开组合框的下拉菜单时应用程序将崩溃,但类型为Microsoft的除外。Ui。Xaml。未处理的异常。通过代码设置SelectedIndex属性具有相同的效果。

调试时,应用程序在编译器生成的名为App.g.i.cs.的文件中中断以下方法的最后一个if语句

public void InitializeComponent()
{
if (_contentLoaded)
return;
_contentLoaded = true;
global::System.Uri resourceLocator = new global::System.Uri("ms-appx:///App.xaml");
global::Microsoft.UI.Xaml.Application.LoadComponent(this, resourceLocator);
#if DEBUG && !DISABLE_XAML_GENERATED_BINDING_DEBUG_OUTPUT
DebugSettings.BindingFailed += (sender, args) =>
{
global::System.Diagnostics.Debug.WriteLine(args.Message);
};
#endif
#if DEBUG && !DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION
UnhandledException += (sender, e) =>
{
if (global::System.Diagnostics.Debugger.IsAttached) global::System.Diagnostics.Debugger.Break();
};
#endif
}

页面:

<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>

背后的代码:

using Microsoft.UI.Xaml.Controls;
using System;
namespace RayMarchEditor
{
public sealed partial class ChooseObjectTypePage : Page
{
public ChooseObjectTypePage()
{
this.InitializeComponent();
comboBox.ItemsSource = new Type[] { typeof(string) };
}
}
}

我复制了您的错误,但无法理解原因。Type是一个抽象类,但这不应该是问题所在。也许这是一个WinUI 3问题。

无论如何,你需要用一个视图模型类或其他东西来包装它,它应该可以工作。

TypeViewModel.cs

public class TypeViewModel
{
public Type Type { get; }
public TypeViewModel(Type type)
{
Type = type;
}
}

选择对象类型Page.xaml.cs

public sealed partial class ChooseObjectTypePage : Page
{
public ChooseObjectTypePage()
{
this.InitializeComponent();
comboBox.ItemsSource = new TypeViewModel[] { new TypeViewModel(typeof(string)) };
}
}

选择ObjectTypePage.xaml

<ComboBox x:Name="comboBox" HorizontalAlignment="Stretch">
<ComboBox.ItemTemplate>
<DataTemplate x:DataType="local:TypeViewModel">
<TextBlock Text="{Binding Type.Name}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>

相关内容

  • 没有找到相关文章

最新更新