web-dev-qa-db-fra.com

CommandParameter booléen en 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 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)?

63
Matěj Zábský

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}"/>
90
H.B.

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

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

22
Onur

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"
16
javicabanas

Peut-être quelque chose comme

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

StaticBoolean est

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

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.

1
MarqueIV