Compartir a través de


IValueConverter Interfaz

Definición

Expone métodos que permiten modificar los datos a medida que pasan por el motor de enlace.

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

Ejemplos

En el ejemplo siguiente se muestra cómo implementar la interfaz IValueConverter y usar el convertidor cuando se enlazan datos a una colección de objetos .

Nota:

Si usaS C++/WinRT (o C++/CX), consulta Formato o conversión de valores de datos para mostrar para obtener más ejemplos de código de creación de tu propio convertidor de valores. En ese tema también se describe cómo podría usar el atributo ConverterParameter con funciones de formato de cadena de 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();
        }
    }
}

Comentarios

Puede crear una clase que le permita convertir el formato de los datos entre el origen y el destino heredando de IValueConverter. Por ejemplo, es posible que desee tener una lista de colores que almacene como valores RGBA , pero mostrarlos con nombres de color en la interfaz de usuario. Al implementar Convert y ConvertBack, puede cambiar el formato de los valores de datos a medida que se pasan entre el destino y el origen mediante el motor de enlace. Siempre debe implementar Convert con una implementación funcional, pero es bastante habitual implementar ConvertBack para que notifique una excepción no implementada. Solo necesitas un método ConvertBack en el convertidor si usas el convertidor para enlaces bidireccionales o usas XAML para la serialización.

UnsetValue debe devolverse desde una implementación de IValueConverter que proporciona la conversión en un enlace de datos a una propiedad de dependencia, en cualquier caso en el que el convertidor no pueda convertir un valor de origen. Los convertidores no deben producir excepciones para ese caso en Convertir; se mostrarán como excepciones en tiempo de ejecución que tendría que agregar control para en UnhandledException o peor aún aparecen a los usuarios como excepciones en tiempo de ejecución reales. Las implementaciones del convertidor deben seguir el patrón de enlace general que cualquier enlace con errores no hace nada y no proporciona un valor, y UnsetValue en lugar de null es el valor centinela para ese caso que el motor de enlace entiende. Para obtener más información, consulta el tema Enlace de datos en profundidad.

Nota:

Para enlazar datos a un convertidor de valores personalizados escrito en extensiones de componentes de Visual C++ (C++/CX), el archivo de encabezado en el que se define la clase de implementación IValueConverter debe incluirse, directa o indirectamente, en uno de los archivos de código subyacente. Para obtener más información, consulta Creación de la primera con C++.

Sugerencia

Algunas de las plantillas de proyecto predeterminadas para una aplicación para UWP incluyen una clase auxiliar, BooleanToVisibilityConverter. Esta clase es una implementación de IValueConverter que controla un escenario común de control personalizado en el que se usan valores booleanos de la clase lógica de control para establecer el valor Visibility en las plantillas de control XAML.

Notas de migración

En el Windows Runtime, los parámetros de lenguaje para los métodos IValueConverter usan cadenas, en lugar de usar objetos CultureInfo como lo hacen en las definiciones de Windows Presentation Foundation (WPF) y Microsoft Silverlight de la interfaz.

Métodos

Convert(Object, TypeName, Object, String)

Modifica los datos de origen antes de pasarlos al destino para mostrarlos en la interfaz de usuario.

ConvertBack(Object, TypeName, Object, String)

Modifica los datos de destino antes de pasarlos al objeto de origen. Este método se llama solo en enlaces de TwoWay .

Se aplica a

Consulte también