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 . |