2013-03-08 13 views
6

Wiążę właściwość DataGrid.ItemsSource z obiektem List<PersonDetails>. Dostaję dane poprzez Usługa WCF z obsługą Silverlight. Klasa PersonDetails jest zaimplementowana w Web Project. Każdy tekst nagłówka DataGrid zmienia się tak, jak chcę, jeśli klasa znajduje się w projekcie Silverlight. Ale nie mogę używać tej klasy w serwisie WWW. Jedynym rozwiązaniem jest dodanie tej samej klasy do obu projektów. Ale czy jest jakiś inny sposób?Właściwość nazwy DisplayAttribute nie działa w Silverlight

Klasa wygląda tak:

[DataContract] 
public class PersonGeneralDetails 
{ 
    // Properties 

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

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

Wydaje atrybuty nie są generowane w projekcie internetowym. Wiem, że mogę zmienić tekst nagłówka za pomocą zdarzeń DataGrid. Ale chcę, aby działało z użyciem atrybutów.

Odpowiedz

3

The problem to WCF DataContract to mechanizm, który można stosować w wielu językach i na różnych platformach.

Jeśli spojrzeć na danych odcinkach generowanych przez DataContractSerializer (lub jego kodu w System.Runtime.Serialization.dll konkretnie InternalWriteObjectXyz() metody) zobaczysz, że to jedynie serializes wartości do prostego komunikatu XML. Nie ma nic związanego z .NET Framework, więc wszystkie rodzaje atrybutów, zarówno niestandardowe jak i generowane przez kompilator, zostaną usunięte i nawet nie zostaną odebrane przez klienta.

Działa tworząc kopii danych i wysyłanie ich z serwera do klienta, klienci będą następnie utworzyć nową klasę z tym samym podpisem. Uwaga: NOWA KLASA z tym samym podpisem, NIE TYLKO NOWY OBIEKT oryginalnej klasy.

Oczywiście istnieje pewne obejście tego problemu. Możesz napisać swój własny serializator (patrz na przykład this post on SO) lub własny ISerializationSurrogate.

Jeśli możesz deploy/udostępniać swoje zespoły do klientów masz ładne obejście: wystarczy wdrożyć je i DataContractSerializer zbuduje odpowiednią obiekt na swoich klientów (dokładnie tego samego, trzeba było na serwerze, wraz ze wszystkimi jego atrybuty). Wystarczy pamiętać, że:

  • Jeśli atrybuty niestandardowe pochodzi z wartościami run-time (na przykład z powodu lokalizacji), a następnie zostaną one rozwiązane na kliencie, a nie na serwerze (bo atrybuty będą stworzony na klient, ich wartości nie będą uwzględnione w komunikacie XML).
  • W aplikacji klienckiej należy dodać odniesienie do zestawu zawierającego typy.
  • Kiedy dodać odwołanie serwisowym trzeba instruować VS z nich korzystać (czy będzie to tworzyć serwery proxy), w służbie Ustawienia referencyjne dialogowym wybierz typy ponownego użycia w przywoływanych zespołów (można ograniczyć to jedynie do zgromadzeń chcesz się podzielić).
+0

Dzięki. Naprawdę dobre wyjaśnienie. –

+0

Mam jeszcze jedno pytanie. Studiowałem o rozwiązaniach, które mi zaproponowałeś.Natknąłem się na Dodawanie klasy jako linku. Czy to oznacza wdrażanie/udostępnianie złożeń? –

+0

@FarhadJabiyev Usługi RIA? Nie wiem, czy "zachowują" atrybuty, czy nie, daj mi znać, jeśli to działa! –

Powiązane problemy