DisplayAttribute name属性在Silverlight中不工作

本文关键字:工作 Silverlight name 属性 DisplayAttribute | 更新日期: 2023-09-27 18:03:10

我将DataGrid.ItemsSource属性绑定到List<PersonDetails>对象。我通过启用silverlight的WCF服务获得数据。因此PersonDetails类是在Web Project中实现的。每个DataGrid的标题文本正在改变,因为我想如果类位于Silverlight项目。但是我不能在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事件更改标题文本。但是我想让它工作使用属性

DisplayAttribute name属性在Silverlight中不工作

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

如果您看一下由DataContractSerializer(或其在System.Runtime.Serialization.dll中的代码,特别是InternalWriteObjectXyz()方法)生成的序列化数据,您将看到它只是将值序列化为一个简单的XML消息。没有任何与。net框架相关的东西会在那里,所以所有类型的属性,包括自定义和编译器生成的,将被剥离,甚至不会被客户端接收。

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

当然有一些解决方法。您可以编写自己的序列化器(参见SO的这篇文章中的示例)或自己的ISerializationSurrogate

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

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