Partilhar via


IValueConverter Interface

Definição

Expõe métodos que permitem que os dados sejam modificados à medida que passam pelo mecanismo de associação.

public interface class IValueConverter
/// [Windows.Foundation.Metadata.ContractVersion(Microsoft.UI.Xaml.WinUIContract, 65536)]
/// [Windows.Foundation.Metadata.Guid(2950507519, 4341, 20851, 183, 192, 53, 144, 189, 150, 203, 53)]
struct IValueConverter
[Windows.Foundation.Metadata.ContractVersion(typeof(Microsoft.UI.Xaml.WinUIContract), 65536)]
[Windows.Foundation.Metadata.Guid(2950507519, 4341, 20851, 183, 192, 53, 144, 189, 150, 203, 53)]
public interface IValueConverter
Public Interface IValueConverter
Derivado
Atributos

Exemplos

O exemplo a seguir mostra como implementar a interface IValueConverter e usar o conversor ao associar dados a uma coleção de objetos .

Observação

Se você estiver usando C++/WinRT (ou C++/CX), consulte Formatação ou conversão de valores de dados para exibição para obter mais exemplos de código de criação de seu próprio conversor de valor. Esse tópico também discute como você pode usar o atributo ConverterParameter com funções de formatação de cadeia de caracteres C++.

<UserControl x:Class="ConverterParameterEx.Page"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="using:ConverterParameterEx" 
    Width="400" Height="300">
    <Grid x:Name="LayoutRoot" >
        <Grid.Resources>
           <local:DateFormatter x:Key="FormatConverter" />
        </Grid.Resources>
        
        <ComboBox Height="60" Width="250" x:Name="MusicCombo" 
            ItemsSource="{Binding}">
            <ComboBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel>
                        <TextBlock FontWeight="Bold" Text="{Binding Path=Name, Mode=OneWay}" />
                        <TextBlock Text="{Binding Path=Artist, Mode=OneWay}" />
                        <TextBlock Text="{Binding Path=ReleaseDate, Mode=OneWay,
                            Converter={StaticResource FormatConverter}, 
                            ConverterParameter=\{0:d\}}" />
                   </StackPanel>
                </DataTemplate>
            </ComboBox.ItemTemplate>
        </ComboBox>
    </Grid>
</UserControl>
//
// 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();
        }
    }
}

Comentários

Você pode criar uma classe que permite converter o formato de seus dados entre a origem e o destino herdando de IValueConverter. Por exemplo, talvez você queira ter uma lista de cores armazenadas como valores RGBA , mas exibi-las com nomes de cores na interface do usuário. Implementando Convert e ConvertBack, você pode alterar o formato dos valores de dados conforme eles são passados entre o destino e a origem pelo mecanismo de associação. Você sempre deve implementar Converter com uma implementação funcional, mas é bastante comum implementar ConvertBack para que ele relata uma exceção não implementada. Você só precisará de um método ConvertBack no conversor se estiver usando o conversor para associações bidirecionais ou usando XAML para serialização.

UnsetValue deve ser retornado de uma implementação IValueConverter que fornece conversão em uma associação de dados para uma propriedade de dependência, em qualquer caso em que o conversor não consiga converter um valor de origem. Os conversores não devem gerar exceções para esse caso em Converter; elas aparecerão como exceções em tempo de execução para as quais você precisaria adicionar tratamento em UnhandledException ou pior, mas aparecerão para os usuários como exceções de tempo de execução reais. As implementações do conversor devem seguir o padrão de associação geral de que qualquer associação com falha não faz nada e não fornece um valor, e UnsetValue em vez de null é o valor sentinela para esse caso que o mecanismo de associação entende. Para obter mais informações, consulte Vinculação de dados em detalhes.

Observação

Para associar dados a um conversor de valor personalizado escrito em extensões de componente do Visual C++ (C++/CX), o arquivo de cabeçalho no qual a classe de implementação IValueConverter é definida deve ser incluído, direta ou indiretamente, em um dos arquivos code-behind. Para obter mais informações, consulte Criar seu primeiro usando C++.

Dica

Alguns dos modelos de projeto padrão para um aplicativo UWP incluem uma classe auxiliar, BooleanToVisibilityConverter. Essa classe é uma implementação IValueConverter que manipula um cenário de controle personalizado comum em que você usa valores boolianos da classe lógica de controle para definir o valor visibility em modelos de controle XAML.

Notas de migração

No Windows Runtime, os parâmetros de linguagem para métodos IValueConverter usam cadeias de caracteres, em vez de usar objetos CultureInfo como fazem nas definições de Windows Presentation Foundation (WPF) e Microsoft Silverlight da interface.

Métodos

Convert(Object, TypeName, Object, String)

Modifica os dados de origem antes de passá-los para o destino para exibição na interface do usuário.

ConvertBack(Object, TypeName, Object, String)

Modifica os dados de destino antes de passá-los para o objeto de origem. Esse método é chamado apenas em associações TwoWay .

Aplica-se a

Confira também