2013-03-08 3 views
6

Я являюсь обязательным DataGrid.ItemsSource собственности List<PersonDetails> объекта. Я получаю данные через Служба WCF с поддержкой Silverlight. Таким образом, класс PersonDetails реализован в веб-проекте. Каждый текст заголовка DataGrid изменяется, как я хочу, если класс находится в проекте Silverlight. Но тогда я не могу использовать этот класс в веб-службе. Единственное решение состоит в том, чтобы добавить тот же класс в оба проекта. Но, есть ли другой способ?Свойство DisplayAttribute имя не работает в Silverlight

Класс выглядит следующим образом:

[DataContract] 
public class PersonGeneralDetails 
{ 
    // Properties 

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

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

Кажется, атрибуты не генерируются в веб-проекте. Я знаю, что я могу изменить текст заголовка, используя события DataGrid. Но я хочу, чтобы он работал с использованием атрибутов.

ответ

3

Задача - это WCF DataContract - это взаимодействующий механизм, который может использоваться на разных языках и платформах.

Если вы посмотрите на сериализованные данные, генерируемых DataContractSerializer (или его код в System.Runtime.Serialization.dll, в частности InternalWriteObjectXyz() методов) вы увидите, что это просто упорядочивает значения в простое сообщение XML. Ничего, связанного с .NET Framework, не будет, поэтому все виды атрибутов, как сгенерированные пользователем, так и с помощью компилятора, будут удалены и даже не будут получены клиентом.

Он работает создавая копии ваших данных и отправки их от сервера к клиенту, клиенты будут затем создать новый класс с той же подписью. Примечание: a НОВЫЙ КЛАСС с той же подписью, НЕ ПРОСТО НОВЫЙ ОБЪЕКТ первоначального класса.

Конечно, есть обходное решение для этого. Вы можете написать свой собственный сериализатор (см. Пример this post on SO) или ваш собственный ISerializationSurrogate.

Если вы можете развернуть/поделиться сборки для ваших клиентов у вас есть хороший обходной путь: просто развернуть их и DataContractSerializer будет строить правильный объект на ваших клиентов (точно такой же, который вы имели на сервере, со всеми его атрибуты). Только помните, что:

  • Если пользовательские атрибуты происходит от значений времени выполнения (например, из-за локализацию), то они будут решены на клиенте, а не на сервере (так как атрибуты будут созданы на клиент, их значения не будут включены в XML-сообщение).
  • В клиентском приложении вам необходимо добавить ссылку на сборку, которая содержит ваши типы.
  • При добавлении ссылки на службу, вы должны инструктировать VS использовать их (или он будет создавать прокси), в Service Reference Settings диалог выбором типов Повторного использования в ссылочных сборках (вы можете ограничить это только сборки вы хотите поделиться).
+0

Спасибо. Действительно хорошее объяснение. –

+0

Кроме того, у меня есть еще один вопрос. Я изучал решения, которые вы мне предложили.Я столкнулся с добавлением класса в качестве ссылки. Означает ли это развертывание/совместное использование сборок? –

+0

@FarhadJabiev RIA Services? Я не знаю, будут ли они «сохранять» атрибуты или нет, сообщите мне, если это сработает! –

Смежные вопросы