it-swarm.com.de

wie kann ich eine ganze Zahl als ConverterParameter übergeben?

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 muss es eine ganze Zahl sein. natürlich kann ich den string analysieren, aber muss ich das tun?

danke für jede hilfe konstantin

84
akonsu

Hier gehts!

<RadioButton Content="None"
             xmlns:sys="clr-namespace:System;Assembly=mscorlib">
    <RadioButton.IsChecked>
        <Binding Path="MyProperty"
                 Converter="{StaticResource IntToBoolConverter}">
            <Binding.ConverterParameter>
                <sys:Int32>0</sys:Int32>
            </Binding.ConverterParameter>
        </Binding>
    </RadioButton.IsChecked>
</RadioButton>

Der Trick besteht darin, den Namespace für die grundlegenden Systemtypen einzuschließen und dann mindestens die ConverterParameter-Bindung in Elementform zu schreiben.

93
jpierson

Der Vollständigkeit halber noch eine mögliche Lösung (vielleicht mit weniger Tippen):

<Window
    xmlns:sys="clr-namespace:System;Assembly=mscorlib" ...>
    <Window.Resources>
        <sys:Int32 x:Key="IntZero">0</sys:Int32>
    </Window.Resources>

    <RadioButton Content="None"
                 IsChecked="{Binding MyProperty,
                                     Converter={StaticResource IntToBoolConverter},
                                     ConverterParameter={StaticResource IntZero}}" />

(Natürlich kann Window durch UserControl ersetzt werden und IntZero kann näher am Ort der tatsächlichen Verwendung definiert werden.)

40
Vlad

Nicht sicher, warum WPF-Leute dazu neigen, MarkupExtension zu verwenden. Es ist die perfekte Lösung für viele Probleme, einschließlich des hier genannten Problems.

public sealed class Int32Extension : MarkupExtension
{
    public Int32Extension(int value) { this.Value = value; }
    public int Value { get; set; }
    public override Object ProvideValue(IServiceProvider sp) { return Value; }
};

Wenn diese Markup-Erweiterung im XAML-Namespace 'm' verfügbar ist, wird das Beispiel des ursprünglichen Posters folgendermaßen:

<RadioButton Content="None"
             IsChecked="{Binding MyProperty,
                         Converter={StaticResource IntToBoolConverter},
                         ConverterParameter={m:Int32 0}}" />

Dies funktioniert, weil der Markup-Erweiterungsparser den starken Typ des Konstruktorarguments sehen und entsprechend konvertieren kann, während das ConverterParameter-Argument von Binding (weniger informativ) vom Typ Objected ist.

32
Glenn Slayden

Verwenden Sie nicht value.Equals. Benutzen:

  Convert.ToInt32(value) == Convert.ToInt32(parameter)
4
Aliostad

Es wäre schön, die Typinformationen für den ConverterValue in XAML irgendwie auszudrücken, aber ich glaube nicht, dass dies ab sofort möglich ist. Ich denke, Sie müssen das Konverterobjekt durch eine benutzerdefinierte Logik zu Ihrem erwarteten Typ analysieren. Ich sehe keinen anderen Weg.

0
SKG