IValueConverter.Convert(Object, TypeName, Object, String) メソッド
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
UI に表示するためにソース データをターゲットに渡す前に変更します。
public:
Platform::Object ^ Convert(Platform::Object ^ value, TypeName targetType, Platform::Object ^ parameter, Platform::String ^ language);
IInspectable Convert(IInspectable const& value, TypeName const& targetType, IInspectable const& parameter, winrt::hstring const& language);
public object Convert(object value, System.Type targetType, object parameter, string language);
function convert(value, targetType, parameter, language)
Public Function Convert (value As Object, targetType As Type, parameter As Object, language As String) As Object
パラメーター
- value
-
Object
Platform::Object
IInspectable
ターゲットに渡されるソース データ。
型参照としてのターゲット プロパティの型 (Microsoft .NET の場合は System.Type 、C++/CX および C++/WinRT の TypeName ヘルパー構造体)。
- parameter
-
Object
Platform::Object
IInspectable
コンバーター ロジックで使用する省略可能なパラメーター。
- language
-
String
Platform::String
winrt::hstring
変換の言語。
戻り値
ターゲット依存関係プロパティに渡される値。
例
次の例は、 パラメーターと言語パラメーターを使用して Convert メソッドを実装する方法を示しています。
//
// 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();
}
}
}
Imports System.Collections.ObjectModel
Imports System.Windows.Data
Imports System.Globalization
Partial Public Class Page
Inherits UserControl
Public MyMusic As New ObservableCollection(Of Recording)()
Public Sub New()
InitializeComponent()
' Add items to the collection.
MyMusic.Add(New Recording("Sheryl Crow", "Detours", New DateTime(2008, 2, 5)))
MyMusic.Add(New Recording("Brandi Carlisle", "The Story", New DateTime(2007, 4, 3)))
MyMusic.Add(New Recording("Patty Griffin", "Children Running Through", New DateTime(2007, 2, 6)))
' Set the data context for the combo box.
MusicCombo.DataContext = MyMusic
End Sub
End Class
' Simple business object.
Public Class Recording
Public Sub New()
End Sub
Public Sub New(ByVal artistName As String, ByVal cdName As String, _
ByVal release As DateTime)
Artist = artistName
Name = cdName
ReleaseDate = release
End Sub
Private artistValue As String
Private nameValue As String
Private releaseDateValue As DateTime
Public Property Artist() As String
Get
Return artistValue
End Get
Set(ByVal value As String)
artistValue = value
End Set
End Property
Public Property Name() As String
Get
Return nameValue
End Get
Set(ByVal value As String)
nameValue = value
End Set
End Property
Public Property ReleaseDate() As DateTime
Get
Return releaseDateValue
End Get
Set(ByVal value As DateTime)
releaseDateValue = value
End Set
End Property
End Class
Public Class DateFormatter
Implements IValueConverter
' This converts the DateTime object to the string to display.
Public Function Convert(ByVal value As Object, ByVal targetType As Type, _
ByVal parameter As Object, ByVal language As System.String) As Object _
Implements IValueConverter.Convert
' Retrieve the format string and use it to format the value.
Dim formatString As String = TryCast(parameter, String)
If Not String.IsNullOrEmpty(formatString) Then
Return String.Format(New CultureInfo(language), formatString, value)
End If
' If the format string is null or empty, simply call ToString()
' on the value.
Return value.ToString()
End Function
' No need to implement converting back on a one-way binding.
Public Function ConvertBack(ByVal value As Object, ByVal targetType As Type, _
ByVal parameter As Object, _
ByVal language As System.String) As Object _
Implements IValueConverter.ConvertBack
Throw New NotImplementedException()
End Function
End Class
注釈
Convert メソッドの targetType パラメーターは、Microsoft .NET と C++ のどちらを使用してプログラミングしているかに応じて、型システム情報をレポートするさまざまな手法を使用します。
- Microsoft .NET の場合、このパラメーターは System.Type 型のインスタンスを渡します。
- C++/CX および C++/WinRT の場合、このパラメーターは TypeName 構造体の値を渡します。
TypeName::Kind
には、Microsoft と同様に、型の単純な文字列名が含まれています。NET のType.Name
。 コンバーターがバインド エンジンによって呼び出されると、ターゲット依存関係プロパティのプロパティ型を検索することによって targetType 値が渡されます。 Convert 実装では、次の 2 つの理由のいずれかでこの値を使用できます。 - コンバーターでは、常に特定の型のオブジェクトが返されることを想定しており、コンバーターが呼び出されるバインディングでコンバーターが正しく使用されていることを確認する必要があります。 そうでない場合は、フォールバック値を返すか、例外をスローする可能性があります (ただし、以下の「コンバーターからの例外」を参照してください)。
- コンバーターは複数の型を返すことができます。また、 を使用して、返す必要がある型をコンバーターに通知する必要があります。 たとえば、オブジェクトからオブジェクトへの変換と、オブジェクトから文字列への変換を同じコンバーター コード内に実装できます。
language は、システム値ではなく、特定のバインディングの ConverterLanguage 値から取得されるため、空の文字列である可能性があります。
パラメーター は、特定のバインディングの ConverterParameter 値から取得され、既定では null です 。 コンバーターでパラメーターを使用して返される内容を変更する場合は、通常、バインディングによって渡され、コンバーターによって処理される内容を検証するための規則が必要です。 一般的な規則は、コンバーターのモードに名前を付け、結果として異なる戻り値になる文字列を渡すことです。 たとえば、異なる UI コントロールの種類とレイアウトでの表示に適した、それぞれ異なる長さの文字列を返す "Simple" モードと "Verbose" モードがあるとします。
コンバーターからの例外
データ バインディング エンジンは、ユーザー指定のコンバーターによってスローされる例外をキャッチしません。 Convert メソッドによってスローされた例外、または Convert メソッドが呼び出すメソッドによってスローされたキャッチされていない例外は、実行時エラーとして扱われます。 バインディングでフォールバックを使用できる状況でコンバーターを使用している場合、または変換エラーが発生した場合でも適切な結果が表示される場合は、コンバーターが DependencyProperty.UnsetValue を返し、例外をスローしないことを検討してください。 DependencyProperty.UnsetValue は依存関係プロパティ システムで特別な意味を持つ sentinel 値であり、この値を渡されるバインドでは FallbackValue が使用されます。
例外をスローするもう 1 つの方法は、元の 値 を変更せずに返し、バインディング インスタンスがその値で何を行うかを処理できるようにすることです。 ほとんどの場合、失敗した UI バインドはエラー ケースになりません。 ソース値は使用せず、 代わりに DependencyProperty.UnsetValue を使用して何も表示しないか、フォールバックを使用します。
値に何かを行うことに基づいて try/catch は Convert メソッドの一般的な実装パターンですが、上記の理由から、再スローしないでください。
パラメーターと言語パラメーターを使用して Convert メソッドを実装する方法を示す例については、IValueConverter インターフェイスを参照してください。