Bagikan melalui


IValueConverter.Convert(Object, TypeName, Object, String) Metode

Definisi

Memodifikasi data sumber sebelum meneruskannya ke target untuk ditampilkan di UI.

public:
 Platform::Object ^ Convert(Platform::Object ^ value, TypeName targetType, Platform::Object ^ parameter, Platform::String ^ language);
IInspectable Convert(IInspectable const& value, TypeName const& targetType, IInspectable const& parameter, winrt::hstring const& language);
public object Convert(object value, System.Type targetType, object parameter, string language);
function convert(value, targetType, parameter, language)
Public Function Convert (value As Object, targetType As Type, parameter As Object, language As String) As Object

Parameter

value
Object

Platform::Object

IInspectable

Data sumber yang diteruskan ke target.

targetType
TypeName Type

Jenis properti target, sebagai referensi jenis (System.Type untuk Microsoft .NET, struct pembantu TypeName untuk ekstensi komponen Visual C++ (C++/CX)).

parameter
Object

Platform::Object

IInspectable

Parameter opsional yang akan digunakan dalam logika konverter.

language
String

Platform::String

winrt::hstring

Bahasa konversi.

Mengembalikan

Object

Platform::Object

IInspectable

Nilai yang akan diteruskan ke properti dependensi target.

Contoh

Contoh berikut menunjukkan cara mengimplementasikan metode Konversi menggunakan parameter dan parameter bahasa .

//
// MainPage.xaml.h
// Declaration of the MainPage class.
// 

#pragma once

#include "MainPage.g.h"

namespace IValueConverterExample
{

    // Simple business object.
    [Windows::UI::Xaml::Data::Bindable]
    public ref class Recording sealed 
    {
    public: 
        Recording (Platform::String^ artistName, Platform::String^ cdName, Windows::Foundation::DateTime release)
        {
            Artist = artistName;
            Name = cdName;
            ReleaseDate = release;
        }
        property Platform::String^ Artist;
        property Platform::String^ Name;
        property Windows::Foundation::DateTime ReleaseDate;
    };

    public ref class DateFormatter  sealed : Windows::UI::Xaml::Data::IValueConverter 
    {
        // This converts the DateTime object to the Platform::String^ to display.
    public:
        virtual Platform::Object^ Convert(Platform::Object^ value, Windows::UI::Xaml::Interop::TypeName targetType, 
            Platform::Object^ parameter, Platform::String^ language)
        {
            Windows::Foundation::DateTime dt = safe_cast<Windows::Foundation::DateTime>(value); 
            Windows::Globalization::DateTimeFormatting::DateTimeFormatter^ dtf =
                Windows::Globalization::DateTimeFormatting::DateTimeFormatter::ShortDate;
            return dtf->Format(dt); 
        }

        // No need to implement converting back on a one-way binding 
        virtual Platform::Object^ ConvertBack(Platform::Object^ value, Windows::UI::Xaml::Interop::TypeName targetType, 
            Platform::Object^ parameter, Platform::String^ language)
        {
            throw ref new Platform::NotImplementedException();
        }
    };

    /// <summary>
    /// An empty page that can be used on its own or navigated to within a Frame.
    /// </summary>
    public ref class MainPage sealed
    {
    public:
        MainPage()
        {	
            m_myMusic = ref new Platform::Collections::Vector<Recording^>();

            // Add items to the collection.

            // You can use a Calendar object to create a Windows::Foundation::DateTime
            auto c = ref new Windows::Globalization::Calendar();
            c->Year = 2008;
            c->Month = 2;
            c->Day = 5;
            m_myMusic->Append(ref new Recording("Chris Sells", "Chris Sells Live",
                c->GetDateTime()));

            c->Year = 2007;
            c->Month = 4;
            c->Day = 3;
            m_myMusic->Append(ref new Recording("Luka Abrus",
                "The Road to Redmond", c->GetDateTime()));
            
            c->Year = 2007;
            c->Month = 2;
            c->Day = 3;
            m_myMusic->Append(ref new Recording("Jim Hance",
                "The Best of Jim Hance", dt));
            InitializeComponent();

            // Set the data context for the combo box.
            MusicCombo->DataContext = m_myMusic;	
        }


    protected:
        virtual void OnNavigatedTo(Windows::UI::Xaml::Navigation::NavigationEventArgs^ e) override;

    private:
        Windows::Foundation::Collections::IVector<Recording^>^ m_myMusic;
    };
}
using System;
using System.Collections.ObjectModel;
using System.Globalization;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Data;

namespace ConverterParameterEx
{
    public partial class Page : UserControl
    {

        public ObservableCollection<Recording> MyMusic =
            new ObservableCollection<Recording>();
        public Page()
        {
            InitializeComponent();

            // Add items to the collection.
            MyMusic.Add(new Recording("Chris Sells", "Chris Sells Live",
                new DateTime(2008, 2, 5)));
            MyMusic.Add(new Recording("Luka Abrus",
                "The Road to Redmond", new DateTime(2007, 4, 3)));
            MyMusic.Add(new Recording("Jim Hance",
                "The Best of Jim Hance", new DateTime(2007, 2, 6)));

            // Set the data context for the combo box.
            MusicCombo.DataContext = MyMusic;
        }
    }

    // Simple business object.
    public class Recording
    {
        public Recording() { }
        public Recording(string artistName, string cdName, DateTime release)
        {
            Artist = artistName;
            Name = cdName;
            ReleaseDate = release;
        }
        public string Artist { get; set; }
        public string Name { get; set; }
        public DateTime ReleaseDate { get; set; }
    }

    public class DateFormatter : IValueConverter
    {
        // This converts the DateTime object to the string to display.
        public object Convert(object value, Type targetType, 
            object parameter, string language)
        {
            // Retrieve the format string and use it to format the value.
            string formatString = parameter as string;
            if (!string.IsNullOrEmpty(formatString))
            {
                return string.Format(
                    new CultureInfo(language), formatString, value);
            }
            // If the format string is null or empty, simply call ToString()
            // on the value.
            return value.ToString();
        }

        // No need to implement converting back on a one-way binding 
        public object ConvertBack(object value, Type targetType, 
            object parameter, string language)
        {
            throw new NotImplementedException();
        }
    }
}

Keterangan

Parameter targetType dari metode Konversi menggunakan teknik yang berbeda untuk melaporkan info sistem jenis, tergantung pada apakah Anda memprogram dengan ekstensi komponen Microsoft .NET atau Visual C++ (C++/CX).

  • Untuk Microsoft .NET, parameter ini meneruskan instans jenis System.Type .
  • Untuk ekstensi komponen Visual C++ (C++/CX), parameter ini melewati nilai struktur TypeName . TypeName::Kind berisi nama string sederhana dari jenis , mirip dengan Microsoft . NET's Type.Name. Ketika pengonversi dipanggil oleh mesin pengikatan, nilai targetType diteruskan dengan mencari jenis properti properti dependensi target. Anda dapat menggunakan nilai ini dalam implementasi Konversi karena salah satu dari dua alasan:
  • Pengonversi Anda memiliki harapan bahwa itu selalu akan mengembalikan objek dari jenis tertentu, dan Anda ingin memverifikasi bahwa pengikatan yang dipanggil pengonversi menggunakan pengonversi dengan benar. Jika tidak, Anda mungkin mengembalikan nilai fallback, atau melemparkan pengecualian (tetapi lihat "Pengecualian dari pengonversi" di bawah).
  • Pengonversi Anda dapat mengembalikan lebih dari satu jenis, dan Anda ingin penggunaan menginformasikan pengonversi Anda jenis mana yang harus dikembalikan. Misalnya, Anda dapat mengimplementasikan konversi objek-ke-objek dan konversi objek-ke-string dalam kode pengonversi yang sama.

bahasa berasal dari nilai ConverterLanguage dari pengikatan tertentu, bukan nilai sistem, jadi Anda harus mengharapkan bahwa itu mungkin string kosong.

parameter berasal dari nilai ConverterParameter dari pengikatan tertentu, dan null secara default. Jika pengonversi Anda menggunakan parameter untuk memodifikasi apa yang dikembalikannya, ini biasanya memerlukan beberapa konvensi untuk memvalidasi apa yang diteruskan oleh pengikatan dan ditangani oleh pengonversi. Konvensi umumnya adalah meneruskan string yang memberi nama mode untuk pengonversi Anda yang menghasilkan nilai pengembalian yang berbeda. Misalnya, Anda mungkin memiliki mode "Sederhana" dan "Verbose" yang mengembalikan string panjang berbeda yang masing-masing sesuai untuk ditampilkan dalam jenis dan tata letak kontrol UI yang berbeda.

Pengecualian dari pengonversi

Mesin pengikatan data tidak menangkap pengecualian yang dilemparkan oleh pengonversi yang disediakan pengguna. Pengecualian apa pun yang dilemparkan oleh metode Konversi, atau pengecualian yang tidak terjaring yang dilemparkan oleh metode yang dipanggil metode Konversi, diperlakukan sebagai kesalahan run-time. Jika Anda menggunakan pengonversi dalam situasi di mana pengikatan dapat menggunakan fallback atau menampilkan hasil yang wajar bahkan jika kegagalan konversi terjadi, pertimbangkan untuk mengembalikan pengonversi DependencyProperty.UnsetValue dan tidak melemparkan pengecualian. DependencyProperty.UnsetValue adalah nilai sentinel yang memiliki arti khusus dalam sistem properti dependensi, dan pengikatan yang diteruskan nilai ini akan menggunakan FallbackValue.

Alternatif lain untuk melemparkan pengecualian adalah mengembalikan nilai asli yang tidak berubah, dan membiarkan instans pengikatan menangani apa yang mungkin dilakukan dengan nilai tersebut. Dalam kebanyakan kasus, pengikatan UI yang gagal tidak akan menjadi kasus kesalahan. Mereka hanya tidak akan menggunakan nilai sumber dan sebaliknya akan menggunakan DependencyProperty.UnsetValue untuk tidak menampilkan apa pun, atau menggunakan fallback.

try/catch berdasarkan melakukan sesuatu yang perlu dihargai adalah pola implementasi umum untuk metode Konversi, tetapi Anda tidak boleh melakukan rethrow, karena alasan yang disebutkan di atas.

Untuk contoh yang menunjukkan cara mengimplementasikan metode Konversi menggunakan parameter dan parameter bahasa , lihat antarmuka IValueConverter .

Berlaku untuk

Lihat juga