6

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

这个类看起来像这样:

[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 事件更改标题文本。但我想使用属性使其工作。

4

1 回答 1

3

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

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

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

当然,有一些解决方法。您可以编写自己的序列化程序(例如,请参阅SO 上的这篇文章)或您自己的ISerializationSurrogate.

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

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