J'essaye 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 une chaîne. 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
wpf
binding
ivalueconverter
Akonsu
la source
la source
Réponses:
Et voilà!
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.
la source
IValueConverter.Convert()
de » « paramètre » paramètre estobject
. Vous devez encore le lancer / analyser ...Pour être complet, une autre solution possible (peut-être avec moins de frappe):
(Bien sûr,
Window
peut être remplacé parUserControl
, etIntZero
peut être défini plus près du lieu d'utilisation réel.)la source
Je ne sais pas pourquoi les
WPF
gens ont tendance à être peu enclins à utiliserMarkupExtension
. C'est la solution parfaite pour de nombreux problèmes, y compris le problème mentionné ici.Si cette extension de balisage est disponible dans l'
XAML
espace de noms 'm', alors l'exemple de l'affiche d'origine devient:Cela fonctionne parce que l'analyseur d'extension de balisage peut voir le type fort de l'argument du constructeur et effectuer la conversion en conséquence, tandis que l'argument ConverterParameter de Binding est (de manière moins informative) de type Object.
la source
Value
unobject
plutôt queint
, éviter de le boxer à chaque foisProvideValue
. (Et puis, faites-leprivate
pour éviter d'attribuer directement quelque chose d'illégal).ProvideValue
n'est appelé qu'une seule fois par instance d'extension de balisage, de sorte que l'encadrement ne devrait se produire qu'une seule fois de toute façon. En ne le faisant pas dans le constructeur, j'évite complètement la boxe si elleProvideValue
n'est jamais appelée. Quant à rendreValue
privé, cela empêcherait d'utiliser l'extension de balisage dans laXAML
syntaxe des éléments d'objet: msdn.microsoft.com/en-us/libraryBinding.ConverterParameter
n'a pas de type spécifique (c'est juste unobject
) donc l'analyseur ne sait pas quelle conversion appliquer, donc chaque littéral est simplement traité comme une chaîne.{m:Int32 Value=0}
cela fonctionnerait tout aussi bien.)N'utilisez pas
value.Equals
. Utilisation:la source
value.Equals
?Ce serait bien d'exprimer les informations de type pour le ConverterValue en XAML, mais je ne pense pas que ce soit possible pour le moment. Donc, je suppose que vous devez analyser l'objet Converter selon votre type attendu par une logique personnalisée. Je ne vois pas d'autre moyen.
la source