IProvideValueTarget Schnittstelle

Definition

Stellt einen Dienst dar, der situationsbedingte Objekteigenschaftsbeziehungen zur Auswertung der Markuperweiterung meldet.

public interface class IProvideValueTarget
public interface IProvideValueTarget
type IProvideValueTarget = interface
Public Interface IProvideValueTarget

Hinweise

IProvideValueTarget stellt einen Dienst dar, der Informationen über die Objekt-Eigenschaftsstruktur umgibt, in der ein Wertkonverter aufgerufen wird.

Typkonverter und Markuperweiterungen können als Dienst für den Dienstkontext abfragen IProvideValueTarget , der von einem XAML-Objektwriter bereitgestellt wird, wenn der XAML-Objektschreiber das Wertkonvertierungsverhalten aufruft. Weitere Informationen finden Sie unter Typkonverter und Markuperweiterungen für XAML- und Dienstkontexte verfügbar für Typkonverter und Markuperweiterungen.

Insbesondere für Markuperweiterungen ist es IProvideValueTarget hilfreich, die Gültigkeit der situationsbedingten Verwendung Ihrer Markuperweiterung zu bestimmen. Ihre Markuperweiterung könnte beispielsweise einen Mechanismus zur Zurückstellung von Werten implementieren. Die Verwendung dieses Mechanismus ist jedoch nur geeignet, wenn das Zielobjekt zur Laufzeit andere Komponenten ihres Verzögerungsmechanismus verwenden kann. Sie können die Typsystemmerkmale des als zurückgegebenen TargetObject Objekts überprüfen und sicherstellen, dass das Objekt Ihre Verzögerungstechnik unterstützt. Wenn ja, gibt die Markuperweiterung einen Wert zurück, und wenn nicht, löst die Markuperweiterung eine Ausnahme aus, die von einem XAML-Objektwriter als innere Ausnahme aufgenommen wird. In einem ähnlichen Szenario wird sichergestellt, dass eine bestimmte Eigenschaft eine Funktion unterstützt, indem die Typsystemmerkmale des TargetPropertyüberprüft werden.

Obwohl der API-Name IProvideValueTarget eine Zuordnung mit MarkupExtension.ProvideValueimpliziert, können die von gemeldeten IProvideValueTarget Informationen auch für ein TypeConverter oder ValueSerializernützlich sein. Ein TypeConverter oder ValueSerializer verfügt in der Regel über mehr Kontext als eine Markuperweiterung, da sie einem bestimmten Zieltyp oder einer bestimmten Zieleigenschaft zugeordnet sind und daher die situationsbezogene Gültigkeit im Typsystem in der Regel vorhersagbar ist. Es gibt jedoch andere Szenarien. Im Folgenden finden Sie eine Liste einiger Szenarien, die entweder von einem Typkonverter oder einer Markuperweiterung implementiert werden können:

  • Lesen Sie TargetObject instance Werte anderer Eigenschaften für dieses Objekt. Beachten Sie, dass Ihre Behandlung hier möglicherweise robust für nicht festgelegte Werte sein muss, da die Verarbeitungsreihenfolge von XAML-Membern für das Zielobjekt nicht deterministisch sein kann.

  • Rufen Sie ab TargetObject , um Metadaten auf Typebene zu lesen oder zu überprüfen, ob erforderliche Schnittstellen vom Typ implementiert werden.

  • Abrufen TargetProperty , um Eigenschaftsmetadaten zu lesen.

Ein Szenario besteht darin, Informationen zu verwenden IProvideValueTarget , um zu begrenzen, welche Objekte oder Eigenschaften von Ihrer Markuperweiterung festgelegt werden dürfen.

Bevor Sie versuchen, den Dienst zu verwenden, stellen Sie sicher, dass der Dienst selbst nicht null von dem entsprechenden Dienstanbieterparameter zurückgegeben wird, den Sie für den Kontext verwenden.

Wichtig

Bei verwendung des Diensts ist es besonders wichtig, das Objekt, auf das von der -Eigenschaft verwiesen wird, oder andere Objekte, auf die TargetObject dieses Objekt verweist, nicht zu ändern. Speziell für WPF können diese Änderungen zu unerwarteten Änderungen führen, die das WPF-Eigenschaftensystem ungültig würden.

Hinweis

Verwenden Sie nicht den Typ von TargetProperty , um zu bestimmen, welchen genauen Typ eine Markuperweiterung oder ein Typkonverter zurückgeben soll. Das ist keine bewährte Methode. Ihr Rückgabetyp sollte mit Attributing (MarkupExtensionReturnTypeAttribute für Markuperweiterungen) oder Mustern (Klassenname des Typkonverters) konsistent sein.

In früheren Versionen des .NET Framework war diese Schnittstelle in der WPF-spezifischen Assembly WindowsBase vorhanden. In .NET Framework 4 IProvideValueTarget befindet sich in der System.Xaml-Assembly. Weitere Informationen finden Sie unter Types Migrated from WPF to System.Xaml.

Hinweise zur WPF-Verwendung

Dieser Dienst unterstützt Frameworkfeatures wie die Bindung an eine Abhängigkeitseigenschaft.

In WPF kann der von IProvideValueTarget dargestellte Dienst Objekte und Eigenschaften für Situationen zurückgeben, in denen der Wert, der von einer Markuperweiterung oder einem Typkonverter zurückgegeben werden soll, vom Kontext abhängt.

IProvideValueTarget wird in der internen Implementierung von BindingBasestark genutzt, der -Klasse, die den Bindungsmechanismus für Abhängigkeitseigenschaften in WPF implementiert.

Ein standardmäßiger interner Dienstanbieter für WPF wird für die Verwendung durch eine benutzerdefinierte Markuperweiterung oder einen Typkonverter implementiert IProvideValueTarget . Das von gemeldete IProvideValueTarget Objekt und die Eigenschaft können nur vom internen WPF-Dienst festgelegt werden. Um über diese Definition der Funktionsweise IProvideValueTarget hinaus zu gehen, würde die Definition Ihres eigenen Dienstanbieters für Die Verwendung von Markuperweiterungen und Typkonvertern erforderlich sein, der mindestens die IProvideValueTarget Dienste und IXamlTypeResolver implementiert, und dies ist ein erweitertes Szenario, das hier nicht beschrieben wird.

Ein NULL-Wert für TargetProperty oder TargetObject bedeutet nicht unbedingt, dass eine Markuperweiterung oder ein Typkonverter nicht handeln kann, obwohl dies von Ihrer Implementierung abhängt. Ein Beispielfall, in dem die Werte von IProvideValueTarget null sind, auch wenn der Dienst verfügbar ist, ist, wenn Ihre Markuperweiterung in einer anderen Markuperweiterung geschachtelt ist, z. B. .Binding Eine Implementierung, die auf IProvideValueTarget basiert, sollte immer auf NULL-Werte überprüfen, wenn nur zum Auslösen einer bestimmten Ausnahme, wenn dies Ihr beabsichtigter Entwurf ist.

Eigenschaften

TargetObject

Ruft das Zielobjekt ab, das gemeldet wird.

TargetProperty

Ruft einen Bezeichner für die Zieleigenschaft ab, die gemeldet wird.

Gilt für:

Weitere Informationen