IValueConverter 接口
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
公开允许在数据通过绑定引擎时对其进行修改的方法。
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 值,但在 UI 中显示颜色名称。 通过实现 Convert 和 ConvertBack,可以在绑定引擎在目标和源之间传递数据值时更改数据值的格式。 应始终使用功能实现实现 Convert ,但实现 ConvertBack 以便报告未实现的异常相当常见。 如果对双向绑定使用转换器或使用 XAML 进行序列化,则仅在转换器中需要 ConvertBack 方法。
在转换器无法转换源值的任何情况下,应从 IValueConverter 实现返回 UnsetValue,该实现在数据绑定中提供到依赖属性的转换。 转换器不应在 Convert 中针对这种情况引发异常;这些异常将显示为运行时异常,你需要在 UnhandledException 中添加处理,或者更糟,但在用户看来是实际的运行时异常。 转换器实现应遵循常规绑定模式,即任何失败的绑定不执行任何操作且不提供值, UnsetValue 而不是 null 是绑定引擎理解的该情况的 sentinel 值。 有关详细信息,请参阅深入了解数据绑定。
注意
若要将数据绑定到用 Visual C++ 组件扩展 (C++/CX) 编写的自定义值转换器,必须直接或间接地将定义 IValueConverter 实现类的头文件包含在代码隐藏文件中。 有关详细信息,请参阅 使用 C++ 创建第一个。
提示
UWP 应用的一些默认项目模板包括帮助程序类 BooleanToVisibilityConverter。 此类是一个 IValueConverter 实现,用于处理常见的自定义控件方案,在该方案中,使用控件逻辑类中的布尔值在 XAML 控件模板中设置 Visibility 值。
迁移说明
在Windows 运行时中,IValueConverter 方法的语言参数使用字符串,而不是像在接口的 Windows Presentation Foundation (WPF) 和 Microsoft Silverlight 定义中那样使用 CultureInfo 对象。
方法
Convert(Object, TypeName, Object, String) |
在将源数据传递到目标以在 UI 中显示之前对其进行修改。 |
ConvertBack(Object, TypeName, Object, String) |
在将目标数据传递到源对象之前对其进行修改。 此方法仅在 TwoWay 绑定中调用。 |