Omówienie konwerterów typów dla języka XAML

Konwertery typów dostarczają logikę modułu zapisywania obiektów, który konwertuje z ciągu w znaczników XAML na określone obiekty na grafie obiektu. W usługach XAML platformy .NET konwerter typów musi być klasą pochodzącą z TypeConverterklasy . Niektóre konwertery obsługują również ścieżkę zapisywania XAML i mogą służyć do serializacji obiektu w postaci ciągu w znaczników serializacji. W tym temacie opisano, jak i kiedy są wywoływane konwertery typów w języku XAML, oraz zawiera porady dotyczące implementacji przesłonięć TypeConvertermetod .

Pojęcia dotyczące konwersji typów

W poniższych sekcjach opisano podstawowe pojęcia dotyczące sposobu używania ciągów przez język XAML oraz sposobu używania konwerterów typów w usługach .NET XAML do przetwarzania niektórych wartości ciągów napotkanych w źródle XAML.

XAML i wartości ciągu

Po ustawieniu wartości atrybutu w pliku XAML początkowy typ tej wartości jest ciągiem w ogólnym sensie i wartością atrybutu ciągu w sensie XML. Nawet inne elementy pierwotne, takie jak Double , są początkowo ciągami do procesora XAML.

W większości przypadków procesor XAML potrzebuje dwóch informacji, aby przetworzyć wartość atrybutu. Pierwszy element informacji jest typem wartości właściwości, która jest ustawiana. Każdy ciąg, który definiuje wartość atrybutu i który jest przetwarzany w języku XAML, musi zostać ostatecznie przekonwertowany lub rozpoznany na wartość tego typu. Jeśli wartość jest elementem pierwotnym zrozumiałym dla analizatora XAML (na przykład wartością liczbową), podejmowana jest bezpośrednia konwersja ciągu. Jeśli wartość atrybutu odwołuje się do wyliczenia, podany ciąg jest sprawdzany pod kątem dopasowania nazwy do nazwanej stałej w tym wyliczenie. Jeśli wartość nie jest zrozumiałym elementem pierwotnym lub stałą nazwą z wyliczenia, odpowiedni typ musi mieć możliwość podania wartości lub odwołania opartego na przekonwertowanym ciągu.

Uwaga

Dyrektywy języka XAML nie używają konwerterów typów.

Konwertery typów i rozszerzenia znaczników

Użycie rozszerzeń znaczników musi być obsługiwane przez procesor XAML przed sprawdzeniem typu właściwości i innych zagadnień. Jeśli na przykład właściwość ustawiana jako atrybut zwykle ma konwersję typu, ale w konkretnym przypadku jest ustawiana przez użycie rozszerzenia znaczników, najpierw procesy zachowania rozszerzenia znaczników. Jedną z typowych sytuacji, w których konieczne jest rozszerzenie znaczników, jest utworzenie odwołania do obiektu, który już istnieje. W tym scenariuszu konwerter typów bezstanowych może wygenerować tylko nowe wystąpienie, co może nie być pożądane. Aby uzyskać więcej informacji na temat rozszerzeń znaczników, zobacz Markup Extensions for XAML Overview (Rozszerzenia znaczników dla języka XAML — omówienie).

Konwertery typów natywnych

W implementacjach usług Windows Presentation Foundation (WPF) i .NET XAML istnieją pewne typy CLR, które mają natywną obsługę konwersji typów. Jednak te typy CLR nie są tradycyjnie uważane za pierwotne. Przykładem takiego typu jest DateTime. Jednym z powodów jest sposób działania architektury programu .NET Framework: typ DateTime jest zdefiniowany w bibliotece mscorlib, czyli najbardziej podstawowej biblioteki na platformie .NET. DateTime program nie może być przypisywany atrybutowi pochodzącemu z innego zestawu, który wprowadza zależność (TypeConverterAttribute pochodzi z systemu). W związku z tym nie można obsługiwać zwykłego mechanizmu odnajdywania konwertera typów przez przypisywanie. Zamiast tego analizator XAML zawiera listę typów, które wymagają przetwarzania natywnego, i przetwarza te typy podobne do sposobu przetwarzania prawdziwych elementów pierwotnych. W przypadku DateTimemetody przetwarzanie obejmuje wywołanie metody Parse.

Implementowanie konwertera typów

W poniższych sekcjach omówiono interfejs API TypeConverter klasy .

TypeConverter

W obszarze Usługi XAML platformy .NET wszystkie konwertery typów używane do celów XAML to klasy pochodzące z klasy TypeConverterbazowej . Klasa TypeConverter istniała w wersjach programu .NET Framework, zanim istniał język XAML. Jednym z oryginalnych TypeConverter scenariuszy było zapewnienie konwersji ciągów dla edytorów właściwości w projektantach wizualizacji.

W przypadku języka XAML rola TypeConverter jest rozszerzana. W celach TypeConverter XAML jest klasą bazową zapewniającą obsługę niektórych konwersji ciągów i ciągów. Funkcja from-string umożliwia analizowanie wartości atrybutu ciągu z języka XAML. To-string może umożliwić przetwarzanie wartości czasu wykonywania określonej właściwości obiektu z powrotem do atrybutu w języku XAML na potrzeby serializacji.

TypeConverter Definiuje cztery elementy członkowskie, które są istotne do konwersji na ciąg i z ciągu na potrzeby przetwarzania XAML:

Spośród tych elementów członkowskich najważniejszą metodą jest ConvertFrom, która konwertuje ciąg wejściowy na wymagany typ obiektu. Metodę ConvertFrom można zaimplementować, aby przekonwertować szerszy zakres typów na zamierzony typ docelowy konwertera. W związku z tym może ona służyć do celów wykraczających poza język XAML, takich jak obsługa konwersji w czasie wykonywania. Jednak w przypadku użycia języka XAML ważna jest tylko ścieżka kodu, która może przetwarzać String dane wejściowe.

Drugą najważniejszą metodą jest ConvertTo. Jeśli aplikacja jest konwertowana na reprezentację znaczników (na przykład jeśli jest zapisywana w języku XAML jako plik), ConvertTo jest zaangażowana w większy scenariusz modułu zapisywania tekstu XAML w celu utworzenia reprezentacji znaczników. W takim przypadku ważna ścieżka kodu dla kodu XAML jest wtedy, gdy obiekt wywołujący przekazuje destinationTypeStringelement .

CanConvertTo i CanConvertFrom są obsługiwane metody, które są używane, gdy usługa wykonuje zapytanie o możliwości implementacji TypeConverter . Należy zaimplementować te metody, aby wrócić true do przypadków specyficznych dla typu, które są obsługiwane przez równoważne metody konwersji konwertera. W celach XAML zazwyczaj oznacza String to typ.

Konwertery informacji o kulturze i typów dla języka XAML

Każda implementacja TypeConverter może jednoznacznie interpretować, co jest prawidłowym ciągiem konwersji, i może również używać lub ignorować opis typu, który jest przekazywany jako parametry. Ważną kwestią dotyczącą konwersji typów kultury i XAML jest następująca: chociaż używanie ciągów lokalizowalnych jako wartości atrybutów jest obsługiwane przez język XAML, nie można używać tych zlokalizowanych ciągów jako danych wejściowych konwertera typów z określonymi wymaganiami dotyczącymi kultury. To ograniczenie jest spowodowane tym, że konwertery typów dla wartości atrybutów XAML obejmują zachowanie przetwarzania XAML języka stałego, które używa en-US kultury. Aby uzyskać więcej informacji o przyczynach projektowania tego ograniczenia, zobacz specyfikację języka XAML ([MS-XAML]) lub Omówienie globalizacji i lokalizacji WPF.

Jako przykład, w którym kultura może być problemem, niektóre kultury używają przecinka zamiast kropki jako ogranicznika punktów dziesiętnych dla liczb w postaci ciągu. To zastosowanie koliduje z zachowaniem, które mają wiele istniejących konwerterów typów, co polega na użyciu przecinka jako ogranicznika. Przekazywanie kultury xml:lang w otaczającym języku XAML nie rozwiązuje problemu.

Implementowanie konwersji Z

Aby można było używać go jako implementacji obsługującej TypeConverter język XAML, ConvertFrom metoda tego konwertera musi zaakceptować ciąg jako value parametr. Jeśli ciąg ma prawidłowy format i może zostać przekonwertowany przez TypeConverter implementację, zwracany obiekt musi obsługiwać rzutowanie do typu oczekiwanego przez właściwość . W przeciwnym razie implementacja ConvertFrom musi zwrócić wartość null.

Każda implementacja TypeConverter może jednoznacznie interpretować, co stanowi prawidłowy ciąg konwersji, a także używać lub ignorować opis typu lub konteksty kultury, które są przekazywane jako parametry. Jednak przetwarzanie WPF XAML może nie przekazywać wartości do kontekstu opisu typu we wszystkich przypadkach, a także może nie przekazywać kultury na xml:langpodstawie .

Uwaga

Nie należy używać nawiasów klamrowych ({}), w szczególności otwierającego nawiasu klamrowego ({) jako elementu formatu ciągu. Te znaki są zastrzeżone jako wpis i wyjście dla sekwencji rozszerzenia znaczników.

Należy zgłosić wyjątek, gdy konwerter typów musi mieć dostęp do usługi XAML z modułu zapisywania obiektów usług XAML platformy .NET, ale GetService wywołanie wykonywane względem kontekstu nie zwraca tej usługi.

Implementowanie narzędzia ConvertTo

ConvertTo jest potencjalnie używany do obsługi serializacji. Obsługa serializacji za pośrednictwem ConvertTo dla typu niestandardowego i konwertera typów nie jest absolutnym wymaganiem. Jeśli jednak implementujesz kontrolkę lub używasz serializacji w ramach funkcji lub projektu klasy, należy zaimplementować element ConvertTo.

Aby można było używać go jako implementacji obsługującej TypeConverter język XAML, ConvertTo metoda tego konwertera musi akceptować wystąpienie typu (lub wartości), które jest obsługiwane jako value parametr. destinationType Gdy parametr ma typ String, zwracany obiekt musi być w stanie rzutować jako String. Zwrócony ciąg musi reprezentować serializowaną wartość value. W idealnym przypadku wybrany format serializacji powinien mieć możliwość wygenerowania tej samej wartości, co w przypadku przekazania tego ciągu do ConvertFrom implementacji tego samego konwertera bez znacznej utraty informacji.

Jeśli nie można serializować wartości lub konwerter nie obsługuje serializacji, implementacja ConvertTo musi zwrócić null wyjątek i zgłosić wyjątek. Jeśli jednak zgłaszasz wyjątki, należy zgłosić brak możliwości użycia tej konwersji w ramach CanConvertTo implementacji, tak aby najlepsze rozwiązanie w zakresie sprawdzania CanConvertTo z pierwszymi, aby uniknąć wyjątków, jest obsługiwane.

destinationType Jeśli parametr nie jest typu String, możesz wybrać własną obsługę konwertera. Zazwyczaj przywracasz podstawową obsługę implementacji, która w bazie ConvertTo zgłasza określony wyjątek.

Należy zgłosić wyjątek, gdy konwerter typów musi mieć dostęp do usługi XAML z modułu zapisywania obiektów usług XAML platformy .NET, ale GetService wywołanie wykonywane względem kontekstu nie zwraca tej usługi.

Implementowanie elementu CanConvertFrom

Implementacja CanConvertFrom powinna być zwracana true dla sourceType typu String i w przeciwnym razie odroczyć implementację podstawową. Nie zgłaszaj wyjątków z CanConvertFromelementu .

Implementowanie elementu CanConvertTo

Implementacja CanConvertTo powinna zostać zwrócona true dla destinationType typu String, a w przeciwnym razie odroczyć implementację podstawową. Nie zgłaszaj wyjątków z CanConvertToelementu .

Stosowanie atrybutu TypeConverterAttribute

Aby konwerter typów niestandardowych był używany jako konwerter typów działających dla niestandardowej klasy według usług XAML platformy .NET, należy zastosować element TypeConverterAttribute do definicji klasy. Określony ConverterTypeName za pomocą atrybutu musi być nazwą typu konwertera typów niestandardowych. Jeśli zastosujesz ten atrybut, gdy procesor XAML obsługuje wartości, w których typ właściwości używa niestandardowego typu klasy, może on wprowadzać ciągi i zwracać wystąpienia obiektów.

Można również podać konwerter typów na podstawie właściwości. Zamiast stosować TypeConverterAttribute element do definicji klasy, zastosuj ją do definicji właściwości (głównej definicji, a nie get/set implementacji w niej). Typ właściwości musi być zgodny z typem przetwarzanym przez konwerter typów niestandardowych. Po zastosowaniu tego atrybutu, gdy procesor XAML obsługuje wartości tej właściwości, może przetwarzać ciągi wejściowe i zwracać wystąpienia obiektów. Technika konwertera typów dla właściwości jest przydatna, jeśli zdecydujesz się użyć typu właściwości z programu Microsoft .NET Framework lub innej biblioteki, w której nie można kontrolować definicji klasy i nie można jej zastosować TypeConverterAttribute .

Aby podać zachowanie konwersji typu dla niestandardowego dołączonego elementu członkowskiego, zastosuj TypeConverterAttribute się do Get metody dostępu wzorca implementacji dla dołączonego elementu członkowskiego.

Uzyskiwanie dostępu do kontekstu dostawcy usług z implementacji rozszerzenia znaczników

Dostępne usługi są takie same dla każdego konwertera wartości. Różnica polega na tym, jak każdy konwerter wartości odbiera kontekst usługi. Uzyskiwanie dostępu do usług i dostępnych usług opisano w temacie Type Converters and Markup Extensions for XAML (Konwertery typów i rozszerzenia znaczników dla języka XAML).

Konwertery typów w strumieniu węzła XAML

Jeśli pracujesz ze strumieniem węzła XAML, akcja lub wynik końcowy konwertera typów nie jest jeszcze wykonywany. W ścieżce ładowania ciąg atrybutu, który ostatecznie musi zostać przekonwertowany na typ w celu załadowania, pozostaje wartością tekstową w elemencie początkowym i elemencie końcowym. Konwerter typów, który jest ostatecznie potrzebny do tej operacji, można określić za pomocą XamlMember.TypeConverter właściwości . Jednak uzyskanie prawidłowej wartości XamlMember.TypeConverter zależy od kontekstu schematu XAML, który może uzyskać dostęp do takich informacji za pośrednictwem bazowego elementu członkowskiego lub typu wartości obiektu używanej przez element członkowski. Wywołanie zachowania konwersji typów wymaga również kontekstu schematu XAML, ponieważ wymaga mapowania typów i utworzenia wystąpienia konwertera.

Zobacz też