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
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.
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.)
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.
N'utilisez pas value.Equals
. Utilisation:
Convert.ToInt32(value) == Convert.ToInt32(parameter)
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.