System.Type作为转换器的属性 - 仅适用于后面的代码中未使用的属性

时间:2017-07-05 17:15:46

标签: xaml uwp uwp-xaml

我有一个IValueConverter,它具有在XAML中设置的System.Type属性。

转换器:

internal class EnumTypeConverter : IValueConverter
{
    public Type TypeToDisplay { get; set; }

    public object Convert(object value, Type targetType, object parameter, string language)
    {
        return TypeToDisplay?.FullName;
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}

XAML:

<Page
    x:Class="UWPSystemTypeConverterTest.MainPage"
    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"
    xmlns:converter="using:UWPSystemTypeConverterTest.Converter"
    xmlns:enums="using:UWPSystemTypeConverterTest.Enum"
    mc:Ignorable="d">

    <Page.Resources>
        <converter:EnumTypeConverter x:Key="Converter" TypeToDisplay="enums:CustomEnum" />
    </Page.Resources>

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <TextBlock Text="{Binding Converter={StaticResource Converter}}" />
    </Grid>
</Page>

当我运行应用程序时,出现以下错误:

  

Windows.UI.Xaml.Markup.XamlParseException:&#39;与之关联的文字   无法找到此错误代码。

     

无法创建   &#39; UWPSystemTypeConverterTest.Converter.EnumTypeConverter&#39;从文本   &#39;枚举:CustomEnum&#39 ;. [行:14位置:56]&#39;

如果我将一个CustomEnum类型的属性添加到从不使用的代码隐藏文件中,则应用程序可以正常工作。

更改后的代码 - 文件:

public sealed partial class MainPage : Page
{
        public CustomEnum WithThisPropertyTheAppWorks { get; set; }

        public MainPage()
        {
            InitializeComponent();
            this.DataContext = this;
        }
}

完整的复制项目如下:https://github.com/SabotageAndi/UWPSystemTypeConverterTest

取消注释的行是https://github.com/SabotageAndi/UWPSystemTypeConverterTest/blob/master/UWPSystemTypeConverterTest/MainPage.xaml.cs#L13

我怀疑UWP的优化者正在引发这个问题。 这是真的吗? 如何在代码隐藏文件中没有未使用的属性的情况下修复错误?

2 个答案:

答案 0 :(得分:3)

针对UWP Build 10240,一个可行的方法是在实例化转换器之前在页面的静态资源中添加目标枚举的虚拟实例。

 <Page.Resources>
    <enums:CustomEnum x:Key="WorkAround">CustomEnumValue</enums:CustomEnum>
    <converter:EnumTypeConverter x:Key="Converter" TypeToDisplay="enums:CustomEnum" />
</Page.Resources>

答案 1 :(得分:1)

来自MSFT员工的MVP邮件列表信息:

此行为是UWP的当前限制。

XAML编译器和运行时不支持System.Type类型的属性。因此,不会生成所需的元数据,并且运行时无法将字符串转换为类型。

但是由于代码隐藏的公共属性,编译器现在生成所需的元数据。我对这项工作并不满意,但它比其他解决方案更好(例如,带有该类型全名的字符串属性)。