代码之家  ›  专栏  ›  技术社区  ›  RationalGeek

xaml测试数据设计器可以转换类型,但运行时不能

  •  3
  • RationalGeek  · 技术社区  · 14 年前

    我正在设计一个用户控件来显示注释。所以我有一个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”转换为日期时间。为什么设计人员能够处理这个问题,而不是运行时?我应该如何更改我的xaml,以便设计器可以显示测试注释,但运行时不会崩溃?

    2 回复  |  直到 14 年前
        1
  •  1
  •   Pablo Montilla    14 年前

    不知道发生这种情况的原因,但要解决int的问题,可以尝试为noteid指定值的类型:

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

    有点长,但可能有用。

        2
  •  0
  •   AnthonyWJones    14 年前

    设计器通常比标准运行时xaml解析器更宽容。

    我不明白为什么它不能将“1”转换成int32,因为in t是在xaml中进行本机解析的少数几种基本类型之一。你需要装饰你的 CreatedDate 财产 TypeConverterAttribute -

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

    没有这个,xaml解析器就不知道该如何处理日期。更糟糕的是,设计器将使用标准的ui区域性来确定如何解析日期,而xaml将经常使用不同的东西。我发现这个问题很棘手。