Ich versuche, an eine Ganzzahl-Eigenschaft zu binden:
<RadioButton Content="None"
IsChecked="{Binding MyProperty,
Converter={StaticResource IntToBoolConverter},
ConverterParameter=0}" />
und mein Konverter ist:
[ValueConversion(typeof(int), typeof(bool))]
public class IntToBoolConverter : IValueConverter
{
public object Convert(object value, Type t, object parameter, CultureInfo culture)
{
return value.Equals(parameter);
}
public object ConvertBack(object value, Type t, object parameter, CultureInfo culture)
{
return value.Equals(false) ? DependencyProperty.UnsetValue : parameter;
}
}
Das Problem ist, dass beim Aufruf meines Konverters der Parameter string ist. Ich brauche es, um eine ganze Zahl zu sein. Natürlich kann ich den String analysieren, aber muss ich?
danke für jede hilfe konstantin
wpf
binding
ivalueconverter
akonsu
quelle
quelle
Antworten:
Hier gehts!
Der Trick besteht darin, den Namespace für die grundlegenden Systemtypen einzuschließen und dann mindestens die ConverterParameter-Bindung in Elementform zu schreiben.
quelle
IValueConverter.Convert()
‚s ‚Parameter‘ Parameter istobject
. Sie müssen es noch wirken / analysieren ...Der Vollständigkeit halber noch eine mögliche Lösung (möglicherweise mit weniger Eingabe):
(
Window
Kann natürlich durch ersetztUserControl
werden undIntZero
kann näher am tatsächlichen Verwendungsort definiert werden.)quelle
Ich bin mir nicht sicher, warum
WPF
Leute dazu neigen, nicht zu benutzenMarkupExtension
. Es ist die perfekte Lösung für viele Probleme, einschließlich des hier genannten Problems.Wenn diese Markup-Erweiterung im
XAML
Namespace 'm' verfügbar ist, lautet das Beispiel des Originalplakats:Dies funktioniert, weil der Markup-Erweiterungsparser den starken Typ des Konstruktorarguments erkennen und entsprechend konvertieren kann, während das ConverterParameter-Argument von Binding (weniger informativ) objekttypisiert ist.
quelle
Value
ein zu machen,object
alsint
zu vermeiden, es jedes Mal zu boxenProvideValue
. (Und dannprivate
vermeiden Sie es, etwas Illegales direkt zuzuweisen).ProvideValue
nur einmal pro Markup-Erweiterungsinstanz aufgerufen, daher sollte das Boxen ohnehin nur einmal erfolgen. Wenn ich es nicht im Konstruktor mache, vermeide ich das Boxen ganz, wennProvideValue
es nie aufgerufen wird. Da für die Herstellung vonValue
privat, würde dies schließt die Markup - Erweiterung bei der VerwendungXAML
Objektelementsyntax: msdn.microsoft.com/en-us/library/...Binding.ConverterParameter
es keinen bestimmten Typ gibt (es ist nur einobject
), so dass der Parser nicht weiß, welche Konvertierung angewendet werden soll, daher wird jedes Literal nur als Zeichenfolge behandelt.{m:Int32 Value=0}
würde dies genauso gut funktionieren.)Nicht benutzen
value.Equals
. Verwenden:quelle
value.Equals
?Es wäre schön, die Typinformationen für den ConverterValue in XAML irgendwie auszudrücken, aber ich denke nicht, dass dies ab sofort möglich ist. Ich denke, Sie müssen das Konverterobjekt durch eine benutzerdefinierte Logik auf Ihren erwarteten Typ analysieren. Ich sehe keinen anderen Weg.
quelle