Gambaran umum pengonversi jenis untuk XAML
Ketik konverter menyediakan logika untuk penulis objek yang mengonversi dari string dalam markup XAML menjadi objek tertentu dalam grafik objek. Dalam Layanan XAML .NET, pengonversi jenis harus merupakan kelas yang berasal dari TypeConverter. Beberapa konverter juga mendukung jalur penyimpanan XAML dan dapat digunakan untuk menserialisasikan objek ke dalam bentuk string dalam markup serialisasi. Topik ini menjelaskan bagaimana dan kapan pengonversi jenis di XAML dipanggil, dan memberikan saran implementasi untuk penimpaan TypeConvertermetode .
Konsep Konversi Jenis
Bagian berikut menjelaskan konsep dasar tentang bagaimana XAML menggunakan string, dan bagaimana penulis objek di Layanan XAML .NET menggunakan pengonversi jenis untuk memproses beberapa nilai string yang ditemui di sumber XAML.
Nilai XAML dan String
Saat Anda menetapkan nilai atribut dalam file XAML, jenis awal nilai tersebut adalah string dalam arti umum, dan nilai atribut string dalam arti XML. Bahkan primitif lain seperti Double awalnya adalah string ke prosesor XAML.
Dalam kebanyakan kasus, prosesor XAML membutuhkan dua informasi untuk memproses nilai atribut. Bagian pertama dari informasi adalah jenis nilai properti yang sedang diatur. String apa pun yang mendefinisikan nilai atribut dan yang diproses dalam XAML pada akhirnya harus dikonversi atau diselesaikan ke nilai jenis tersebut. Jika nilai adalah primitif yang dipahami oleh pengurai XAML (seperti nilai numerik), konversi langsung string akan dicoba. Jika nilai untuk atribut mereferensikan enumerasi, string yang disediakan dicentang untuk nama yang cocok dengan konstanta bernama dalam enumerasi tersebut. Jika nilai bukan primitif yang dipahami pengurai atau nama konstanta dari enumerasi, jenis yang berlaku harus dapat memberikan nilai atau referensi yang didasarkan pada string yang dikonversi.
Catatan
Direktif bahasa XAML tidak menggunakan pengonversi jenis.
Jenis Konverter dan Ekstensi Markup
Penggunaan ekstensi markup harus ditangani oleh prosesor XAML sebelum memeriksa jenis properti dan pertimbangan lainnya. Misalnya, jika properti yang ditetapkan sebagai atribut biasanya memiliki konversi jenis, tetapi dalam kasus tertentu diatur oleh penggunaan ekstensi markup, maka perilaku ekstensi markup akan diproses terlebih dahulu. Salah satu situasi umum di mana ekstensi markup diperlukan adalah membuat referensi ke objek yang sudah ada. Untuk skenario ini, pengonversi jenis stateless hanya dapat menghasilkan instans baru, yang mungkin tidak diinginkan. Untuk informasi selengkapnya tentang ekstensi markup, lihat Ekstensi Markup untuk Gambaran Umum XAML.
Pengonversi Jenis Asli
Dalam implementasi layanan Windows Presentation Foundation (WPF) dan .NET XAML, ada jenis CLR tertentu yang memiliki penanganan konversi jenis asli. Namun, jenis CLR tersebut tidak dianggap secara konvensional sebagai primitif. Contoh jenis tersebut adalah DateTime. Salah satu alasan untuk ini adalah cara kerja arsitektur .NET Framework: jenis DateTime didefinisikan dalam mscorlib, pustaka paling dasar di .NET. DateTime tidak diizinkan untuk dikaitkan dengan atribut yang berasal dari rakitan lain yang memperkenalkan dependensi (TypeConverterAttribute berasal dari Sistem). Oleh karena itu, mekanisme penemuan konverter jenis biasa dengan attributing tidak dapat didukung. Sebaliknya, parser XAML memiliki daftar jenis yang membutuhkan pemrosesan asli, dan memproses jenis ini mirip dengan bagaimana primitif sejati diproses. Dalam kasus DateTime, pemrosesan ini melibatkan panggilan ke Parse.
Menerapkan Pengonversi Tipe
Bagian berikut membahas API TypeConverter kelas.
TypeConverter
Di bawah Layanan XAML .NET, semua pengonversi jenis yang digunakan untuk tujuan XAML adalah kelas yang berasal dari kelas TypeConverterdasar . Kelas TypeConverter ada dalam versi .NET Framework sebelum XAML ada; salah satu skenario aslinya TypeConverter adalah menyediakan konversi string untuk editor properti di desainer visual.
Untuk XAML, peran TypeConverter diperluas. Untuk tujuan XAML, TypeConverter adalah kelas dasar untuk memberikan dukungan untuk konversi ke string dan dari string tertentu. Dari string memungkinkan penguraian nilai atribut string dari XAML. To-string mungkin memungkinkan pemrosesan nilai run-time properti objek tertentu kembali ke atribut di XAML untuk serialisasi.
TypeConverter menentukan empat anggota yang relevan untuk mengonversi ke string dan dari string untuk tujuan pemrosesan XAML:
Dari anggota ini, metode yang paling penting adalah ConvertFrom, yang mengonversi string input ke jenis objek yang diperlukan. Metode ConvertFrom ini dapat diimplementasikan untuk mengonversi berbagai jenis yang lebih luas ke dalam jenis tujuan yang dimaksudkan dari pengonversi. Oleh karena itu, ini dapat melayani tujuan yang melampaui XAML, seperti mendukung konversi run-time. Namun, untuk penggunaan XAML, hanya jalur kode yang dapat memproses input yang String penting.
Metode kedua yang paling penting adalah ConvertTo. Jika aplikasi dikonversi ke representasi markup (misalnya, jika disimpan ke XAML sebagai file), ConvertTo terlibat dalam skenario penulis teks XAML yang lebih besar untuk menghasilkan representasi markup. Dalam hal ini, jalur kode penting untuk XAML adalah ketika pemanggil melewati destinationType
.String
CanConvertTo dan CanConvertFrom merupakan metode dukungan yang digunakan saat layanan meminta kemampuan TypeConverter implementasi. Anda harus menerapkan metode ini untuk mengembalikan true
kasus khusus jenis yang metode konversi yang setara dari dukungan pengonversi Anda. Untuk tujuan XAML, ini umumnya berarti jenisnya String .
Pengonversi Informasi dan Jenis Budaya untuk XAML
Setiap TypeConverter implementasi dapat secara unik menafsirkan apa itu string yang valid untuk konversi, dan juga dapat menggunakan atau mengabaikan deskripsi jenis yang diteruskan sebagai parameter. Pertimbangan penting untuk budaya dan konversi jenis XAML adalah sebagai berikut: meskipun menggunakan string yang dapat dilokalkan karena nilai atribut didukung oleh XAML, Anda tidak dapat menggunakan string yang dapat dilokalkan ini sebagai input pengonversi jenis dengan persyaratan budaya tertentu. Batasan ini karena pengonversi jenis untuk nilai atribut XAML melibatkan perilaku pemrosesan XAML bahasa tetap yang selalu menggunakan en-US
budaya. Untuk informasi selengkapnya tentang alasan desain untuk pembatasan ini, lihat spesifikasi bahasa XAML ([MS-XAML]) atau Gambaran Umum Globalisasi dan Pelokalan WPF.
Sebagai contoh di mana budaya dapat menjadi masalah, beberapa budaya menggunakan koma alih-alih periode sebagai pembatas titik desimal untuk angka dalam bentuk string. Penggunaan ini bertabrakan dengan perilaku yang dimiliki banyak pengonversi jenis yang ada, yaitu menggunakan koma sebagai pemisah. Melewati budaya xml:lang
di sekitar XAML tidak menyelesaikan masalah.
Menerapkan ConvertFrom
Agar dapat digunakan sebagai TypeConverter implementasi yang mendukung XAML, metode untuk pengonversi tersebut ConvertFrom harus menerima string sebagai value
parameter. Jika string dalam format yang valid dan dapat dikonversi oleh TypeConverter implementasi, objek yang dikembalikan harus mendukung cast ke jenis yang diharapkan oleh properti . Jika tidak, ConvertFrom implementasi harus mengembalikan null
.
Setiap TypeConverter implementasi dapat secara unik menafsirkan apa yang merupakan string yang valid untuk konversi, dan juga dapat menggunakan atau mengabaikan deskripsi jenis atau konteks budaya yang diteruskan sebagai parameter. Namun, pemrosesan WPF XAML mungkin tidak meneruskan nilai ke konteks deskripsi jenis dalam semua kasus dan juga mungkin tidak meneruskan budaya berdasarkan xml:lang
.
Catatan
Jangan gunakan kurung kurawal ({}), khususnya kurung kurawal pembuka ({), sebagai elemen format string Anda. Karakter ini dicadangkan sebagai entri dan keluar untuk urutan ekstensi markup.
Sangat tepat untuk melemparkan pengecualian ketika pengonversi jenis Anda harus memiliki akses ke layanan XAML dari penulis objek Layanan XAML .NET, tetapi GetService panggilan yang dilakukan terhadap konteks tidak mengembalikan layanan tersebut.
Mengimplementasikan ConvertTo
ConvertTo berpotensi digunakan untuk dukungan serialisasi. Dukungan serialisasi melalui ConvertTo untuk jenis kustom Anda dan pengonversi jenisnya bukan persyaratan absolut. Namun, jika Anda menerapkan kontrol, atau menggunakan serialisasi sebagai bagian dari fitur atau desain kelas Anda, Anda harus menerapkan ConvertTo.
Agar dapat digunakan sebagai TypeConverter implementasi yang mendukung XAML, metode untuk pengonversi tersebut ConvertTo harus menerima instans jenis (atau nilai) yang didukung sebagai value
parameter. destinationType
Ketika parameter berjenis String, objek yang dikembalikan harus dapat ditransmisikan sebagai String. String yang dikembalikan harus mewakili nilai serial dari value
. Idealnya, format serialisasi yang Anda pilih harus dapat menghasilkan nilai yang sama seolah-olah string tersebut ConvertFrom diteruskan ke implementasi pengonversi yang sama, tanpa kehilangan informasi yang signifikan.
Jika nilai tidak dapat diserialisasikan atau pengonversi tidak mendukung serialisasi, ConvertTo implementasi harus mengembalikan null
dan dapat melemparkan pengecualian. Namun, jika Anda melemparkan pengecualian, Anda harus melaporkan ketidakmampuan untuk menggunakan konversi tersebut sebagai bagian dari implementasi Anda CanConvertTo sehingga praktik terbaik memeriksa dengan CanConvertTo terlebih dahulu untuk menghindari pengecualian didukung.
destinationType
Jika parameter tidak berjenis String, Anda dapat memilih penanganan pengonversi Anda sendiri. Biasanya, Anda kembali ke penanganan implementasi dasar, yang dalam dasarnya ConvertTo menimbulkan pengecualian tertentu.
Sangat tepat untuk melemparkan pengecualian ketika pengonversi jenis Anda harus memiliki akses ke layanan XAML dari penulis objek Layanan XAML .NET, tetapi GetService panggilan yang dilakukan terhadap konteks tidak mengembalikan layanan tersebut.
Menerapkan CanConvertFrom
Implementasi Anda CanConvertFrom harus kembali true
untuk sourceType
jenis String dan jika tidak, tangguhkan implementasi dasar. Jangan melempar pengecualian dari CanConvertFrom.
Menerapkan CanConvertTo
Implementasi Anda CanConvertTo harus kembali true
untuk destinationType
jenis String, dan jika tidak, tangguhkan ke implementasi dasar. Jangan melempar pengecualian dari CanConvertTo.
Menerapkan TypeConverterAttribute
Agar pengonversi jenis kustom Anda digunakan sebagai pengonversi jenis bertindak untuk kelas kustom oleh Layanan XAML .NET, Anda harus menerapkannya TypeConverterAttribute ke definisi kelas Anda. ConverterTypeName yang Anda tentukan melalui atribut harus berupa nama jenis pengonversi jenis kustom Anda. Jika Anda menerapkan atribut ini, ketika prosesor XAML menangani nilai di mana jenis properti menggunakan jenis kelas kustom Anda, ia dapat memasukkan string dan mengembalikan instans objek.
Anda juga dapat menyediakan pengonversi jenis berdasarkan per properti. Alih-alih menerapkan TypeConverterAttribute ke definisi kelas, terapkan ke definisi properti (definisi utama, bukan implementasi di get
/set
dalamnya). Jenis properti harus cocok dengan jenis yang diproses oleh pengonversi tipe kustom Anda. Dengan atribut ini diterapkan, ketika prosesor XAML menangani nilai properti tersebut, ia dapat memproses string input dan mengembalikan instans objek. Teknik pengonversi jenis per properti berguna jika Anda memilih untuk menggunakan jenis properti dari Microsoft .NET Framework atau dari beberapa pustaka lain di mana Anda tidak dapat mengontrol definisi kelas dan tidak dapat menerapkannya TypeConverterAttribute di sana.
Untuk menyediakan perilaku konversi jenis untuk anggota terlampir kustom, terapkan TypeConverterAttribute ke Get
metode aksesor pola implementasi untuk anggota terlampir.
Mengakses Konteks Penyedia Layanan dari Implementasi Ekstensi Markup
Layanan yang tersedia sama untuk pengonversi nilai apa pun. Perbedaannya adalah bagaimana setiap pengonversi nilai menerima konteks layanan. Mengakses layanan dan layanan yang tersedia didokumenkan dalam topik Jenis Pengonversi dan Ekstensi Markup untuk XAML.
Ketik Pengonversi di Aliran Simpul XAML
Jika Anda bekerja dengan aliran simpul XAML, tindakan atau hasil akhir dari pengonversi jenis belum dijalankan. Dalam jalur beban, string atribut yang akhirnya perlu dikonversi jenis untuk memuat tetap sebagai nilai teks dalam anggota awal dan anggota akhir. Pengonversi jenis yang akhirnya diperlukan untuk operasi ini dapat ditentukan dengan menggunakan XamlMember.TypeConverter properti . Namun, mendapatkan nilai yang valid dari XamlMember.TypeConverter bergantung pada konteks skema XAML, yang dapat mengakses informasi tersebut melalui anggota yang mendasar, atau jenis nilai objek yang digunakan anggota. Memanggil perilaku konversi jenis juga memerlukan konteks skema XAML karena memerlukan pemetaan jenis dan membuat instans konverter.
Baca juga
.NET Desktop feedback