XamlCompiler错误WMC0055:无法将文本值'10 .0'分配到'Decimal'类型的属性'xx'

时间:2016-04-21 13:16:49

标签: c# xaml uwp win-universal-app

我想在我的UWP XAML代码中添加一个staticresource,如下所示:

<Page
x:Class="Appnap.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:Appnap"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Page.Resources>
    <local:MyCoffee CoffeeName="Esperso" Price="10.0" x:Key="okkk">
    </local:MyCoffee>
</Page.Resources>
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <TextBlock Name="test" Text="{Binding CoffeeName,Source={StaticResource okkk}}" Margin="155,150,-155,-150" />   
</Grid>

我还添加了以下咖啡类:

namespace Appnap
{
    public partial class MyCoffee
    {
        public string CoffeeName { get; set; }
        public decimal Price { get; set; }
    }
}

当我尝试编译我的代码时,我得到的错误是该值无法分配给价格(XamlCompiler错误WMC0055:无法将文本值'10 .0'分配到'Decimal'类型的属性'Price'中) 我尝试过:10,10.0和10M,但没有任何改变。

2 个答案:

答案 0 :(得分:2)

正如XamlCompiler错误所说,问题在于XamlCompiler无法转换文本值&#39; 10.0&#39;进入Decimal

在UWP XAML中,它使用名为Type Converter的功能执行转换,将字符串值转换为该值的强类型版本。 Type Converter只是一个具有一个函数的类,即转换字符串值 成为一个强大的类型。并且通用Windows平台API中内置了其中一些。有关详细信息,请参阅:UWP-005 - Understanding Type Converters

但是,decimal的类型转换器不在内置UWP API中。 XamlCompiler无法将您在XAML中设置的值解析为TypeConverter。在WPF中,我们可以使用MyCoffee类为不受支持的类创建自己的TypeConverter。但是UWP不支持这一点。

作为一种变通方法,您可以在代码隐藏中初始化Binding并在XAML中使用DataContext,如下所示:

在代码隐藏中,为页面设置public MainPage() { this.InitializeComponent(); //Set DataContext for the page this.DataContext = new MyCoffee { CoffeeName = "Esperso", Price = 10M }; //Or for the TextBlock //test.DataContext = new MyCoffee { CoffeeName = "Esperso", Price = 10M }; } 或TextBlock

<TextBlock Name="test" Margin="155,150,-155,-150" Text="{Binding CoffeeName}" /> 

在XAML中,使用

MyCoffee

这是我们用于绑定的最常用方式。

但是,如果您确实希望将StaticResource用作Price,则可以将double的类型设置为date_added,这是现有类型转换器支持的。但是,这可能会失去一定的价格准确性,这取决于您的具体数据。

答案 1 :(得分:1)

使用IValueConverter,创建一个新类并实现IValueConverter,在绑定到此属性时选择创建的值转换器。