IValueConverter Интерфейс

Определение

Предоставляет методы, которые позволяют изменять данные при их прохождении через подсистему привязки.

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
Производный
Атрибуты

Примеры

В следующем примере показано, как реализовать интерфейс IValueConverter и использовать преобразователь при привязке данных к коллекции объектов .

Примечание

Если вы используете C++/WinRT (или C++/CX), дополнительные примеры кода создания собственного преобразователя значений см. в статье Форматирование или преобразование значений данных . В этом разделе также рассматривается использование атрибута ConverterParameter с функциями форматирования строк 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();
        }
    }
}

Комментарии

Можно создать класс, который позволяет преобразовывать формат данных между исходным и целевым путем наследования от IValueConverter. Например, может потребоваться иметь список цветов, которые хранятся в виде значений RGBA , но отображаются с именами цветов в пользовательском интерфейсе. Реализуя convert и ConvertBack, можно изменить формат значений данных по мере их передачи между целевым объектом и источником подсистемой привязки. Преобразование всегда следует реализовывать с функциональной реализацией, но это довольно часто используется для реализации ConvertBack , чтобы он сообщал о не реализованном исключении. Метод ConvertBack требуется только в преобразователе, если вы используете преобразователь для двусторонних привязок или XAML для сериализации.

UnsetValue следует возвращать из реализации IValueConverter, которая обеспечивает преобразование в привязке данных в свойство зависимостей в любом случае, когда преобразователь не может преобразовать исходное значение. Преобразователи не должны создавать исключения для этого случая в преобразовании; Они будут отображаться как исключения времени выполнения, которые необходимо добавить для обработки в UnhandledException или, что еще хуже, будут отображаться для пользователей как фактические исключения времени выполнения. Реализации преобразователя должны соответствовать общему шаблону привязки, при этом любая неисправная привязка не выполняет никаких действий и не предоставляет значения, а UnsetValue , а не NULL — это значение sentinel для этого случая, понятное механизму привязки. Дополнительные сведения см. в статье Подробно о привязке данных.

Примечание

Для привязки данных к пользовательскому преобразователю значений, написанному в расширениях компонентов Visual C++ (C++/CX), файл заголовка, в котором определен класс реализации IValueConverter, должен быть прямо или косвенно включен в один из файлов кода программной части. Дополнительные сведения см. в статье Создание первого экземпляра с помощью C++.

Совет

Некоторые шаблоны проектов по умолчанию для приложения UWP включают вспомогательный класс BooleanToVisibilityConverter. Этот класс представляет собой реализацию IValueConverter, которая обрабатывает распространенный сценарий пользовательского элемента управления, в котором используются логические значения из класса логики элемента управления для задания значения Visibility в шаблонах элементов управления XAML.

Примечания о переходе

В среда выполнения Windows параметры языка для методов IValueConverter используют строки, а не объекты CultureInfo, как в определениях интерфейса Windows Presentation Foundation (WPF) и Microsoft Silverlight.

Методы

Convert(Object, TypeName, Object, String)

Изменяет исходные данные перед их передачей в целевой объект для отображения в пользовательском интерфейсе.

ConvertBack(Object, TypeName, Object, String)

Изменяет целевые данные перед их передачей в исходный объект. Этот метод вызывается только в привязках TwoWay .

Применяется к

См. также раздел