我将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事件更改标题文本。但我想让它使用属性。
答案 0 :(得分:3)
问题是WCF DataContract
是一种可互操作的机制,可以跨语言和平台使用。
如果您查看由DataContractSerializer
(或其System.Runtime.Serialization.dll
中的代码,特别是InternalWriteObjectXyz()
方法)生成的序列化数据,您会发现它只是将值序列化为一个简单的XML消息。没有任何与.NET Framework相关的内容,因此所有类型的属性(自定义和编译器生成)都将被剥离,甚至不会被客户端接收。
它可以创建数据副本并将它们从服务器发送到客户端,然后客户端将创建一个具有相同签名的新类。注意: NEW CLASS 具有相同的签名,不仅仅是原始类的新对象。
当然有一些解决方法。您可以编写自己的序列化工具(有关示例,请参阅this post on SO)或您自己的ISerializationSurrogate
。
如果您可以部署/共享您的程序集,那么您有一个很好的解决方法:只需部署它们,DataContractSerializer
将在您的客户端构建正确的对象(与您完全相同)在服务器上,具有所有属性)。请记住: