Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Topik ini memperkenalkan tujuan konversi jenis dari string sebagai fitur bahasa XAML umum. Dalam .NET Framework, TypeConverter kelas ini melayani tujuan tertentu sebagai bagian dari implementasi untuk kelas kustom terkelola yang dapat digunakan sebagai nilai properti dalam penggunaan atribut XAML. Jika Anda menulis kelas kustom, dan Anda ingin instans kelas Anda dapat digunakan sebagai nilai atribut yang dapat ditetapkan XAML, Anda mungkin perlu menerapkan TypeConverterAttribute ke kelas Anda, menulis kelas kustom TypeConverter , atau keduanya.
Konsep Konversi Jenis
Nilai dalam XAML dan String
Saat Anda menetapkan nilai atribut dalam file XAML, jenis awal nilai tersebut adalah string dalam teks murni. Bahkan primitif lain seperti Double awalnya adalah string teks ke prosesor XAML.
Prosesor XAML membutuhkan dua informasi untuk memproses nilai atribut. Bagian pertama dari informasi adalah jenis nilai properti yang sedang ditetapkan. 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 adalah enumerasi, string digunakan untuk memeriksa kecocokan nama dengan konstanta bernama dalam enumerasi tersebut. Jika nilainya bukan primitif yang dipahami pengurai atau enumerasi, maka jenis yang dimaksud harus dapat memberikan instans jenis, atau nilai, berdasarkan string yang dikonversi. Ini dilakukan dengan menunjukkan kelas pengubah tipe. Konverter tipe secara efektif adalah kelas pembantu yang menyediakan nilai dari kelas lain, baik untuk skenario XAML maupun untuk kemungkinan panggilan dalam kode .NET.
Menggunakan Perilaku Konversi Jenis yang Ada di XAML
Tergantung pada keakraban Anda dengan konsep XAML yang mendasar, Anda mungkin sudah menggunakan perilaku konversi jenis dalam aplikasi dasar XAML tanpa menyadarinya. Misalnya, WPF mendefinisikan ratusan properti yang mengambil nilai jenis Point.
Point adalah nilai yang menjelaskan koordinat dalam ruang koordinat dua dimensi, dan benar-benar hanya memiliki dua properti penting: X dan Y. Saat Anda menentukan titik di XAML, Anda menentukannya sebagai string dengan pemisah (biasanya koma) antara nilai dan X yang Y Anda berikan. Misalnya: <LinearGradientBrush StartPoint="0,0" EndPoint="1,1"/>.
Bahkan jenis Point sederhana ini dan penggunaan sederhananya di XAML melibatkan pengonversi jenis. Dalam hal ini adalah kelas PointConverter.
Pengonversi jenis untuk Point yang ditentukan di tingkat kelas menyederhanakan penggunaan markup semua properti yang menerima Point. Tanpa pengonversi jenis di sini, Anda akan memerlukan markup yang jauh lebih verbose berikut untuk contoh yang sama yang ditunjukkan sebelumnya:
<LinearGradientBrush>
<LinearGradientBrush.StartPoint>
<Point X="0" Y="0"/>
</LinearGradientBrush.StartPoint>
<LinearGradientBrush.EndPoint>
<Point X="1" Y="1"/>
</LinearGradientBrush.EndPoint>
</LinearGradientBrush>
Apakah akan menggunakan string konversi jenis atau sintaks yang lebih verbose setara umumnya merupakan pilihan gaya pengkodean. Alur kerja alat XAML Anda mungkin juga memengaruhi bagaimana nilai diatur. Beberapa alat XAML cenderung menghasilkan markup yang lebih terperinci karena lebih mudah untuk bolak-balik dengan tampilan desainer atau mekanisme serialisasi mereka sendiri.
Konverter tipe yang ada umumnya dapat ditemukan untuk tipe-tipe WPF dan .NET Framework dengan memeriksa kelas (atau properti) untuk keberadaan yang diterapkan TypeConverterAttribute. Atribut ini akan memberi nama kelas yang merupakan pengonversi jenis pendukung untuk nilai jenis tersebut, untuk tujuan XAML serta kemungkinan tujuan lainnya.
Jenis Konverter dan Ekstensi Markup
Ekstensi markup dan pengonversi jenis mengisi peran ortogonal dalam hal perilaku prosesor XAML dan skenario yang diterapkan. Meskipun konteks tersedia untuk penggunaan ekstensi markup, perilaku konversi jenis properti di mana ekstensi markup menyediakan nilai umumnya tidak diperiksa dalam implementasi ekstensi markup. Dengan kata lain, bahkan jika ekstensi markup mengembalikan string teks sebagai outputnya ProvideValue , perilaku konversi jenis pada string tersebut sebagaimana diterapkan ke properti tertentu atau jenis nilai properti tidak dipanggil, Umumnya, tujuan ekstensi markup adalah untuk memproses string dan mengembalikan objek tanpa konverter jenis apa pun yang terlibat.
Salah satu situasi umum di mana ekstensi markup diperlukan daripada pengonversi jenis adalah membuat referensi ke objek yang sudah ada. Dalam kondisi terbaik, pengonversi jenis stateless hanya dapat menghasilkan instans baru, yang mungkin tidak diinginkan. Untuk informasi selengkapnya tentang ekstensi markup, lihat Ekstensi Markup dan WPF XAML.
Pengonversi Tipe Asli
Dalam implementasi WPF dan .NET Framework dari parser XAML, ada jenis tertentu yang memiliki penanganan konversi jenis asli, namun bukan jenis yang mungkin secara konvensional dianggap sebagai primitif. Contoh jenis tersebut adalah DateTime. Alasan untuk ini didasarkan pada 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) sehingga mekanisme penemuan pengonversi jenis biasa dengan attributing tidak dapat didukung. Sebaliknya, parser XAML memiliki daftar tipe yang memerlukan pengolahan native dan memprosesnya dengan cara yang mirip seperti pemrosesan elemen primitif. (Dalam hal DateTime ini melibatkan panggilan ke Parse.)
Menerapkan Pengonversi Tipe
TypeConverter
Dalam contoh yang Point diberikan sebelumnya, kelas PointConverter disebutkan. Untuk implementasi .NET XAML, semua pengonversi jenis yang digunakan untuk tujuan XAML adalah kelas yang berasal dari kelas TypeConverterdasar . Kelas TypeConverter ada dalam versi .NET Framework yang mendahului keberadaan XAML; salah satu penggunaan aslinya adalah menyediakan konversi string untuk dialog properti di desainer visual. Untuk XAML, peran TypeConverter diperluas untuk menyertakan menjadi kelas dasar untuk konversi ke string dan dari string yang memungkinkan penguraian nilai atribut string, dan mungkin memproses nilai run-time dari properti objek tertentu kembali ke string untuk serialisasi sebagai atribut.
TypeConverter menentukan empat anggota yang relevan untuk mengonversi ke dan dari string untuk tujuan pemrosesan XAML:
Dari jumlah tersebut, metode yang paling penting adalah ConvertFrom. Metode ini mengonversi string input ke jenis objek yang diperlukan. Secara teknis, metode ConvertFrom ini dapat diimplementasikan untuk mengonversi berbagai jenis yang jauh lebih luas menjadi jenis tujuan yang diinginkan oleh konverter, dan dengan demikian melayani tujuan yang melampaui XAML seperti mendukung konversi run-time, tetapi untuk tujuan XAML, hanya jalur kode yang dapat memproses input String yang penting.
Metode terpenting berikutnya adalah ConvertTo. Jika aplikasi dikonversi ke representasi markup (misalnya, jika disimpan ke XAML sebagai file), ConvertTo bertanggung jawab untuk menghasilkan representasi markup. Dalam hal ini, jalur kode yang penting untuk XAML adalah ketika Anda melewati destinationType dari String.
CanConvertTo dan CanConvertFrom adalah metode dukungan yang digunakan saat layanan meminta kemampuan implementasi TypeConverter. Anda harus menerapkan metode ini untuk mengembalikan true dalam kasus-kasus spesifik tipe yang didukung oleh metode konversi setara dari pengonversi Anda. Untuk tujuan XAML, ini umumnya berarti jenis String.
Informasi Budaya dan Pengonversi Tipe untuk XAML
Setiap TypeConverter implementasi dapat memiliki interpretasi sendiri tentang apa yang merupakan string yang valid untuk konversi, dan juga dapat menggunakan atau mengabaikan deskripsi jenis yang diteruskan sebagai parameter. Ada pertimbangan penting sehubungan dengan budaya dan konversi jenis XAML. Menggunakan string yang dapat dilokalkan sebagai nilai atribut sepenuhnya didukung oleh XAML. Namun, menggunakan string yang dapat dilokalkan sebagai input untuk konverter tipe dengan persyaratan budaya tertentu tidak didukung, karena konverter tipe untuk nilai atribut XAML melibatkan perilaku penguraian dengan bahasa tetap yang pasti, menggunakan budaya en-US. Untuk informasi lebih lanjut tentang alasan desain untuk pembatasan ini, Anda harus berkonsultasi dengan spesifikasi bahasa XAML ([MS-XAML].
Sebagai contoh di mana budaya dapat menjadi masalah, beberapa budaya menggunakan koma sebagai pemisah titik desimal mereka untuk angka. Ini akan bertabrakan dengan perilaku yang dimiliki banyak konverter jenis WPF XAML, yaitu menggunakan koma sebagai pemisah (berdasarkan preseden historis seperti formulir X,Y umum, atau daftar yang dibatasi koma). Bahkan meneruskan pengaturan lokal di XAML sekitarnya (mengatur Language atau xml:lang ke pengaturan budaya sl-SI, contoh pengaturan budaya yang menggunakan koma untuk desimal dengan cara ini) tidak dapat menyelesaikan masalah ini.
Menerapkan ConvertFrom
Agar dapat digunakan sebagai implementasi TypeConverter yang mendukung XAML, metode ConvertFrom untuk pengonversi tersebut harus menerima string sebagai parameter value. Jika string dalam format yang valid, dan dapat dikonversi oleh implementasi TypeConverter, maka objek yang dikembalikan harus mendukung konversi ke jenis yang diharapkan oleh properti. Jika tidak, implementasi ConvertFrom harus mengembalikan null.
Setiap TypeConverter implementasi dapat memiliki interpretasi sendiri tentang 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.
Nota
Jangan gunakan karakter kurung kurawal, terutama {, sebagai elemen yang mungkin dari format string Anda. Karakter-karakter ini dicadangkan sebagai masuk dan keluar untuk urutan ekstensi markup.
Mengimplementasikan fungsi ConvertTo
ConvertTo berpotensi digunakan untuk dukungan serialisasi. Dukungan serialisasi melalui ConvertTo untuk tipe kustom Anda dan konverter tipenya bukanlah persyaratan mutlak. Namun, jika Anda menerapkan kontrol, atau menggunakan serialisasi sebagai bagian dari fitur atau desain kelas Anda, Anda harus menerapkan ConvertTo.
Agar dapat digunakan sebagai implementasi TypeConverter yang mendukung XAML, metode ConvertTo untuk pengonversi tersebut harus menerima instans dari jenis (atau nilai) yang didukung sebagai parameter value.
destinationType Ketika parameter adalah jenis String, maka objek yang dikembalikan harus dapat ditransmisikan sebagai String. String yang dikembalikan harus mewakili nilai serial value. Idealnya, format serialisasi yang Anda pilih harus mampu menghasilkan nilai yang sama jika 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 diizinkan untuk melemparkan pengecualian dalam kasus ini. Namun jika Anda mengeluarkan pengecualian, Anda harus melaporkan ketidakmampuan untuk menggunakan konversi tersebut sebagai bagian dari implementasi Anda CanConvertTo sehingga didukung praktik terbaik dengan memeriksa CanConvertTo lebih dulu untuk menghindari pengecualian.
Jika destinationType parameter tidak berjenis String, Anda dapat memilih penanganan pengonversi Anda sendiri. Biasanya, Anda akan kembali ke penanganan implementasi dasar, yang dalam ConvertTo paling dasar menimbulkan pengecualian tertentu.
Menerapkan CanConvertTo
Implementasi CanConvertTo Anda harus mengembalikan true untuk destinationType dengan jenis String, dan jika tidak, mengacu pada implementasi dasar.
Menerapkan CanConvertFrom
Implementasi CanConvertFrom Anda harus mengembalikan true untuk sourceType dengan jenis String, dan jika tidak, mengacu pada implementasi dasar.
Menerapkan TypeConverterAttribute
Agar pengonversi jenis kustom Anda digunakan sebagai pengonversi jenis yang bertindak untuk kelas kustom oleh prosesor XAML, Anda harus menerapkan TypeConverterAttribute pada definisi kelas Anda. ConverterTypeName yang Anda tentukan melalui atribut harus berupa nama tipe pengonversi kustom Anda. Dengan atribut ini diterapkan, 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 untuk setiap properti. Alih-alih menerapkan TypeConverterAttribute ke definisi kelas, terapkan ke definisi properti (definisi utama, bukan implementasi get/set di 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 sangat 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.
Lihat juga
- TypeConverter
- XAML dalam WPF
- Ekstensi Markup dan XAML WPF
- Sintaks XAML Secara Mendetail
.NET Desktop feedback