2016-04-18 13 views
0

Ich habe ziemlich viel Zeit damit verbracht, verschiedene Möglichkeiten auszuprobieren, um ein Problem zu lösen, das ich habe, ohne Erfolg, also hoffe ich, dass hier jemand helfen kann.Zugriff auf die Bindung vom Typkonverter?

Ich habe ein Textfeld-Element mit Zwei-Wege-Bindung, die einen Typkonverter verwendet, um den Wert von einer Zeichenfolge in einen benutzerdefinierten Datentyp zu konvertieren, sagen wir MyCustomType. Dies funktioniert gut, aber aufgrund einer Änderung in den Anforderungen meines Projekts muss ich jetzt zusätzliche Verarbeitung durchführen, bevor die Konvertierung stattfindet.

Um diese zusätzliche Verarbeitung durchzuführen, muss ich jedoch auf das Textfeld "Quelle" oder den Bindungskontext zugreifen können. Auf beides konnte ich nicht zugreifen.

Gibt es eine Möglichkeit, von einer ConvertFrom() Methode des Typkonverters auf das Quelltextfeld zuzugreifen?

Ich habe versucht, den ITypeDescriptorContext Parameter (durch WPF) an die ConvertFrom() Methode übergeben, aber die meisten Eigenschaften darin sind null.

dh

public class MyCustomTypeConverter : TypeConverter 
{ 
    ... 
    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) 
    { 
     // Context is 
     return new MyCustomType(value); 
    } 
    ... 
} 

The context within ConvertFrom()

Context - additional properties

Ich habe auch eine MultiValueConverter mit versucht, und die Vermeidung der Typ-Wandler vollständig, jedoch führte dies zu einem LOT zusätzlichen Code, und hat nicht wirklich geholfen. Ich würde es vorziehen, diesen Weg zu vermeiden, da ein Typkonverter viel eleganter ist.

Jede Beratung/Unterstützung wäre sehr willkommen! :)

+1

Warum wollen Sie Bindung zugreifen? Kann sein, dass es einen anderen Weg gibt – Nitin

+0

Ich denke nicht, dass es möglich ist, von TypeConverters auf Bindungen zuzugreifen. Sie müssen mit DataLayer arbeiten, scheint auch viel unnötige Arbeit. Wenn Sie die Frage, was das ganze Problem ist, aktualisieren, können Ihnen die Leute auf diese Weise sehr leicht helfen. –

+0

@Nitin, ich habe versucht, auf die Quell-TextBox zuzugreifen, damit ich sie an eine andere Methode (als Referenz) weitergeben kann, damit ich bestimmte Aufgaben bei Validierungsfehlern ausführen kann. Dies ist nicht unbedingt der beste Weg, um dies zu tun, jedoch haben sich die Anforderungen des Projekts relativ spät in der Entwicklungsphase geändert, und dies ist eine funktionale, etwas vorübergehende Lösung. (Es ist ziemlich hoch auf meiner Liste der Dinge zu refaktorieren, wenn ich etwas Zeit habe). Vielen Dank für Ihre Antworten. – XtraSimplicity

Antwort

1

EDIT: ich die Art und Weise zu ändern endete, dass die Validierung durchgeführt wird (unter Verwendung von INotifyDataError stattdessen auf Ausnahmen von der Validierung), und am Ende Umschreiben die ConvertFrom() Methode in meinem Typ Konverter, so dass würde ich nicht müssen auf den TypeDescriptor Kontext zugreifen.

Ich würde nicht empfehlen, den Kontext von der ConvertFrom() -Methode zu verwenden, da es (als private Eigenschaft) nicht garantiert ist, dass die Eigenschaft in der Zukunft existiert (obwohl ich nichts gelesen habe, um dies zu unterstützen ist es am besten zu der Annahme, dass die privaten Eigenschaften können ohne Benachrichtigung von dem MS-Entwicklungsteam) entfernt/umbenannt werden, und es ist nicht festgelegt, wenn der Wert eine Eigenschaft programmatisch einstellen, etwa so:

TypeConverter converter = TypeDescriptor.GetConverter(typeof(MyCustomType)); 
converter.ConvertFrom(mySourceValue); 

Wenn Sie Wenn Sie dies lesen und wirklich auf den Parameter context zugreifen müssen, können Sie dies auf meine eigene Weise tun.


konnte ich dieses Problem zu lösen, indem die ValueConverterContext Klasse abzufragen, und den privaten _targetElement Feld zugreifen, wie folgt aus:

var sourceTextBox = context.GetType().GetField("_targetElement", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(context) 

Danke für Ihre Hilfe dennoch.:)

bearbeiten: Um die Bindungen für diese TextBox zugreifen, können Sie werfen einfach sourceTextBox als TextBox und dann:

var BindingExpression = sourceTextBox.GetBindingExpression(TextBox.TextProperty);