Question

J'ai ce code (qui fonctionne bien):

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

Mais cette commande est appelée plusieurs fois et il gonfle vraiment du code XAML autrement assez simple. Est-ce vraiment la notation la plus courte du paramètre de commande booléen dans XAML (autre que de diviser la commande en plusieurs commandes)?

Était-ce utile?

La solution

Cela peut être un peu un hack mais vous pouvez dériver du KeyBinding classer:

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 étrange:

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

Autres conseils

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 utilisez-le 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 où vit 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ù 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}" />

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 reviennent 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 ça (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}}">

Je définis beaucoup de coutume MarkupExtension Des cours pour beaucoup de choses courantes que je ne veux pas nécessairement stocker dans mes ressources.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top