DisplayAttribute名称属性在Silverlight中不起作用

时间:2013-03-08 11:29:06

标签: c# asp.net wcf silverlight

我将DataGrid.ItemsSource属性绑定到List<PersonDetails>对象。我通过 启用Silverlight的WCF服务 获取数据。所以PersonDetails类在Web Project中实现。如果类位于Silverlight项目中,则每个DataGrid的标题文本都会根据需要进行更改。但是我不能在Web服务中使用这个类。 唯一的解决方案是将相同的类添加到两个项目中。但是,还有其他方法吗?

该课程如下:

[DataContract]
public class PersonGeneralDetails
{
    // Properties

    [DataMember]
    [DisplayAttribute(Name = "Sira")]
    public int RowNumber { get; set; }

    [DataMember]
    [DisplayAttribute(Name = "Seriyasi")]
    public string SerialNumber { get; set; }
}

似乎在Web项目中没有生成属性。我知道我可以使用DataGrid事件更改标题文本。但我想让它使用属性。

1 个答案:

答案 0 :(得分:3)

问题是WCF DataContract是一种可互操作的机制,可以跨语言和平台使用。

如果您查看由DataContractSerializer(或其System.Runtime.Serialization.dll中的代码,特别是InternalWriteObjectXyz()方法)生成的序列化数据,您会发现它只是将值序列化为一个简单的XML消息。没有任何与.NET Framework相关的内容,因此所有类型的属性(自定义和编译器生成)都将被剥离,甚至不会被客户端接收。

它可以创建数据副本并将它们从服务器发送到客户端,然后客户端将创建一个具有相同签名的新类。注意: NEW CLASS 具有相同的签名,不仅仅是原始类的新对象

当然有一些解决方法。您可以编写自己的序列化工具(有关示例,请参阅this post on SO)或您自己的ISerializationSurrogate

如果您可以部署/共享您的程序集,那么您有一个很好的解决方法:只需部署它们,DataContractSerializer将在您的客户端构建正确的对象(与您完全相同)在服务器上,具有所有属性)。请记住:

  • 如果自定义属性来自运行时值(例如由于本地化),那么它们将在客户端上解析,而不是在服务器上解析(因为属性将在客户端上创建,它们的值不会包含在XML消息中。)
  • 在客户端应用程序中,您需要添加对包含类型的程序集的引用。
  • 当您添加服务引用时,您必须指示VS使用它们(或者它将创建代理),在服务引用设置对话框中选择重用引用程序集中的类型(您可以将此限制为仅限您要共享的程序集。)