web-dev-qa-db-fra.com

comment passer un entier en tant que ConverterParameter?

J'essaie de me lier à une propriété entière:

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

et mon convertisseur est:

[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;
    }
}

le problème est que lorsque mon convertisseur est appelé, le paramètre est string. J'ai besoin que ce soit un entier. Bien sûr, je peux analyser la chaîne, mais dois-je le faire?

merci pour toute aide konstantin

84
akonsu

Vous y allez!

<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>

L'astuce consiste à inclure l'espace de noms pour les types de système de base, puis à écrire au moins la liaison ConverterParameter sous forme d'élément.

93
jpierson

Pour être complet, une solution supplémentaire possible (peut-être avec moins de dactylographie):

<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}}" />

(Bien entendu, Window peut être remplacé par UserControl et IntZero peut être défini plus près du lieu d'utilisation réelle.)

40
Vlad

Vous ne savez pas pourquoi les noms de WPF ont tendance à être peu enclins à utiliser MarkupExtension. C'est la solution idéale pour de nombreux problèmes, y compris le problème mentionné ici.

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; }
};

Si cette extension de balisage est disponible dans l'espace de noms XAML 'm', l'exemple de l'affiche d'origine devient:

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

Cela fonctionne car l'analyseur d'extension de balisage peut voir le type fort de l'argument constructeur et le convertir en conséquence, alors que l'argument ConverterParameter de Binding est typé (de manière moins informative) par Object.

32
Glenn Slayden

N'utilisez pas value.Equals. Utilisation:

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

Il serait bien d’exprimer en quelque sorte les informations de type pour ConverterValue en XAML, mais je ne pense pas que ce soit possible pour l’instant. Je suppose donc que vous devez analyser l'objet de conversion selon le type que vous attendez selon une logique personnalisée. Je ne vois pas d'autre moyen.

0
SKG