XAML测试数据 - 设计者可以转换类型,但运行时不能

时间:2010-08-11 13:55:22

标签: wpf silverlight xaml

我正在设计一个用户控件来显示一个音符。所以我有一个NoteViewModel。在我的设计师中,我想要一个测试笔记。所以我在XAML中有以下内容:

<UserControl.Resources>
    <local:NoteViewModel x:Key="ViewModel" d:IsDataSource="True">
        <local:NoteViewModel.Note>
            <localweb:Note
                NoteID="1"
                CreatedBy="Some Guy"
                CreatedDate="2010-01-01 8:00 AM"
                Category="Some Category"
                NoteText="Some Text"
                />
        </local:NoteViewModel.Note>
    </local:NoteViewModel>
</UserControl.Resources>

这在设计时非常有用。但是在运行时我得到的错误是无法将“1”转换为Int32,并且无法将“2010-01-01 8:00 AM”转换为DateTime。为什么设计师能够处理这个而不是运行时?我应该如何更改我的XAML,以便设计人员可以显示测试笔记,但运行时不会崩溃?

2 个答案:

答案 0 :(得分:1)

不知道为什么会发生这种情况,但为了解决Int的问题,你可以尝试为NoteID指定值的类型:

    <localweb:Note xmlns:sys="clr-namespace:System;assembly=mscorelib" ...>
        <localweb:Note.NoteID><sys:Int32>1</sys:Int32></localweb:Note.NoteID>
    </localweb:Note>

有点长,但应该可以工作。

答案 1 :(得分:0)

设计人员通常比标准的运行时Xaml解析器更宽容。

我无法理解为什么它不能将“1”转换为Int32,因为int是本机解析Xaml的少数基本类型之一。您需要使用CreatedDate装饰TypeConverterAttribute属性: -

 [TypeConverterAttribute(typeof(DateTimeTypeConverter))]
 public CreatedDate { get; set; }

没有这个,xaml解析器实际上不知道如何处理日期。更糟糕的是,设计人员将使用标准UI文化来确定如何解析日期,而Xaml将经常使用不同的东西。我发现这个特殊问题非常棘手。