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 и использовать преобразователь при привязке данных к коллекции объектов.
Note
Если вы используете C++/WinRT, ознакомьтесь с разделом Форматирование или преобразование значений данных для отображения дополнительных примеров кода для создания собственного преобразователя значений. В этом разделе также описывается, как использовать атрибут 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 and ConvertBack, можно изменить формат значений данных по мере их передачи между целевым объектом и источником подсистемой привязки. Вы всегда должны реализовать Convert с функциональной реализацией, но это довольно распространено для реализации ConvertBack , чтобы он сообщал неоплетированное исключение. Вам нужен только метод ConvertBack в преобразователе, если вы используете преобразователь для двусторонней привязки или используете XAML для сериализации.
UnsetValue следует возвращать из реализации IValueConverter, которая обеспечивает преобразование привязки данных в свойство зависимостей, в любом случае, если преобразователь не может преобразовать исходное значение. Преобразователи не должны создавать исключения для этого случая в Convert; они будут отображаться в качестве исключений во время выполнения, которые необходимо добавить для обработки в UnhandledException или еще хуже, как фактические исключения во время выполнения. Реализации преобразователя должны соответствовать общему шаблону привязки, что любая неисправная привязка ничего не делает и не предоставляет значение, а unsetValue , а не null , является значением sentinel для этого случая, когда подсистема привязки понимает. Дополнительные сведения см. в разделе Подробное изучение привязки данных.
Note
Для привязки данных к пользовательскому преобразователю значений, написанному на языке C++, файл заголовка, в котором определен класс реализации IValueConverter, должен быть включен прямо или косвенно в один из файлов программной части.
Примечания о переходе
В среда выполнения Windows параметры языка для методов IValueConverter используют строки, а не использование объектов CultureInfo, как и в определении интерфейса Windows Presentation Foundation (WPF).
Методы
| Имя | Описание |
|---|---|
| Convert(Object, TypeName, Object, String) |
Изменяет исходные данные перед передачей в целевой объект для отображения в пользовательском интерфейсе. |
| ConvertBack(Object, TypeName, Object, String) |
Изменяет целевые данные перед передачей его в исходный объект. Этот метод вызывается только в привязках TwoWay . |