J'ai ce code (qui fonctionne parfaitement):
<KeyBinding Key="Enter" Command="{Binding ReturnResultCommand}">
<KeyBinding.CommandParameter>
<s:Boolean>
True
</s:Boolean>
</KeyBinding.CommandParameter>
</KeyBinding>
Où "s" est bien sûr l'espace de noms System.
Mais cette commande est appelée plusieurs fois et elle gonfle vraiment du code XAML sinon plutôt simple. Est-ce vraiment la notation la plus courte du paramètre de commande booléen en XAML (autre que la division de la commande en plusieurs commandes)?
Cela peut être un peu un hack mais vous pouvez dériver de la classe KeyBinding
:
public class BoolKeyBinding : KeyBinding
{
public bool Parameter
{
get { return (bool)CommandParameter; }
set { CommandParameter = value; }
}
}
Usage:
<local:BoolKeyBinding ... Parameter="True"/>
Et une autre solution pas si bizarre:
xmlns:s="clr-namespace:System;Assembly=mscorlib"
<Application.Resources>
<!-- ... -->
<s:Boolean x:Key="True">True</s:Boolean>
<s:Boolean x:Key="False">False</s:Boolean>
</Application.Resources>
Usage:
<KeyBinding ... CommandParameter="{StaticResource True}"/>
Le plus simple est de définir ce qui suit dans les ressources
<System:Boolean x:Key="FalseValue">False</System:Boolean>
<System:Boolean x:Key="TrueValue">True</System:Boolean>
et l'utiliser comme:
<Button CommandParameter="{StaticResource FalseValue}"/>
Je viens de trouver une solution encore plus générique avec cette extension de balisage:
public class SystemTypeExtension : MarkupExtension
{
private object parameter;
public int Int{set { parameter = value; }}
public double Double { set { parameter = value; } }
public float Float { set { parameter = value; } }
public bool Bool { set { parameter = value; } }
// add more as needed here
public override object ProvideValue(IServiceProvider serviceProvider)
{
return parameter;
}
}
Utilisation ("wpf:" est l'espace de noms dans lequel se trouve l'extension):
<KeyBinding Key="F8" Command="{Binding SomeCommand}" CommandParameter="{wpf:SystemType Bool=True}"/>
Vous obtenez même les options True
et False
après avoir tapé Bool=
et tapez la sécurité!
Ou peut-être que:
<Button.CommandParameter>
<s:Boolean>True</s:Boolean>
</Button.CommandParameter>
Où s est l'espace de noms:
xmlns:s="clr-namespace:System;Assembly=mscorlib"
Peut-être quelque chose comme
<KeyBinding Key="Enter" Command="{Binding ReturnResultCommand}"
CommandParameter="{x:Static StaticBoolean.True}" />
où StaticBoolean
est
public static class StaticBoolean
{
public static bool True
{
get { return true; }
}
}
Voici une autre approche où vous définissez vos propres extensions de balisage qui renvoient True
ou False
(ou toute autre valeur que vous souhaitez). Ensuite, vous les utilisez simplement dans XAML comme toute autre extension de balisage:
public class TrueExtension : MarkupExtension {
public override object ProvideValue(IServiceProvider serviceProvider) => true;
}
public class FalseExtension : MarkupExtension {
public override object ProvideValue(IServiceProvider serviceProvider) => false;
}
public class DoubleExtension : MarkupExtension {
public DoubleExtension(){};
public DoubleExtension(double value) => Value = value;
public double Value { get; set; }
public override object ProvideValue(IServiceProvider serviceProvider) => Value;
}
Vous les utilisez ensuite comme ceci (en supposant que votre espace de noms importé est mx
):
<KeyBinding Key="Enter"
Command="{Binding ReturnResultCommand}"
CommandParameter="{mx:True}" />
<Button Visibility="{Binding SomeProperty,
Converter={SomeBoolConverter},
ConverterParameter={mx:True}}">
<!-- This guarantees the value passed is a double equal to 42.5 -->
<Button Visibility="{Binding SomeProperty,
Converter={SomeDoubleConverter},
ConverterParameter={mx:Double 42.5}}">
En fait, je définis beaucoup de classes MarkupExtension
personnalisées pour beaucoup de choses courantes que je ne veux pas nécessairement stocker dans mes ressources.