83 votes

Paramètre de commande booléen dans XAML

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 nom du système.

Mais cette commande est appelée un certain nombre de fois et elle gonfle vraiment un code XAML par ailleurs assez simple. Est-ce vraiment la notation la plus courte du paramètre de commande booléen dans XAML (autre que la division de la commande en plusieurs commandes) ?

118voto

H.B. Points 76352

Il s'agit peut-être d'une astuce, mais vous pouvez dériver de l'approche de la KeyBinding classe :

public class BoolKeyBinding : KeyBinding
{
    public bool Parameter
    {
        get { return (bool)CommandParameter; }
        set { CommandParameter = value; }
    }
}

Utilisation :

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

Utilisation :

<KeyBinding ... CommandParameter="{StaticResource True}"/>

70voto

Gordon Points 211

Le plus simple est de définir les éléments suivants 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}"/>

28voto

javicabanas Points 1

Ou, peut-être, ça :

<Button.CommandParameter>
    <s:Boolean>True</s:Boolean>
</Button.CommandParameter>

Où s est l'espace de nom :

 xmlns:s="clr-namespace:System;assembly=mscorlib"

26voto

Onur Points 1431

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 nom dans lequel se trouve l'extension) :

<KeyBinding Key="F8" Command="{Binding SomeCommand}" CommandParameter="{wpf:SystemType Bool=True}"/>

Vous avez même les options True y False après avoir tapé Bool= et la sécurité des caractères !

6voto

Bala R Points 57552

Peut-être quelque chose comme

<KeyBinding Key="Enter" Command="{Binding ReturnResultCommand}"
    CommandParameter="{x:Static StaticBoolean.True}" />

StaticBoolean es

public static class StaticBoolean
{
    public static bool True
    {
        get { return true; }
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X