Ich habe diesen Code (der genau richtig funktioniert):
<KeyBinding Key="Enter" Command="{Binding ReturnResultCommand}">
<KeyBinding.CommandParameter>
<s:Boolean>
True
</s:Boolean>
</KeyBinding.CommandParameter>
</KeyBinding>
Wobei "s" natürlich der System-Namespace ist.
Dieser Befehl wird jedoch einige Male aufgerufen und bläst den ansonsten recht einfachen XAML-Code wirklich auf. Ist dies wirklich die kürzeste Notation des booleschen Befehlsparameters in XAML (abgesehen von der Aufteilung des Befehls in mehrere Befehle)?
wpf
xaml
routed-commands
Matěj Zábský
quelle
quelle
xmlns:s="clr-namespace:System;assembly=mscorlib"
zu Ihrer Antwort :)Am einfachsten ist es, Folgendes in den Ressourcen zu definieren
<System:Boolean x:Key="FalseValue">False</System:Boolean> <System:Boolean x:Key="TrueValue">True</System:Boolean>
und benutze es wie:
<Button CommandParameter="{StaticResource FalseValue}"/>
quelle
xmlns:System="clr-namespace:System;assembly=mscorlib"
zur BenutzersteuerungOder vielleicht das:
<Button.CommandParameter> <s:Boolean>True</s:Boolean> </Button.CommandParameter>
Wo s ist der Namespace:
quelle
Ich habe gerade eine noch allgemeinere Lösung mit dieser Markup-Erweiterung gefunden:
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; } }
Verwendung ("wpf:" ist der Namespace, in dem sich die Erweiterung befindet):
<KeyBinding Key="F8" Command="{Binding SomeCommand}" CommandParameter="{wpf:SystemType Bool=True}"/>
Sie erhalten sogar die Optionen
True
undFalse
nach dem TippenBool=
und Tippen Sicherheit!quelle
BooleanExtension
) und Sie können z. B.CommandParameter={x:Boolean True}
ähnlich wie docs.microsoft.com/en-us/dotnet/framework/xaml-services/…Vielleicht so etwas wie
<KeyBinding Key="Enter" Command="{Binding ReturnResultCommand}" CommandParameter="{x:Static StaticBoolean.True}" />
wo
StaticBoolean
istpublic static class StaticBoolean { public static bool True { get { return true; } } }
quelle
get
einfach eine Konstante zu initialisierenpublic static bool True = true;
und eine weitere Konstante hinzuzufügenpublic static bool False = false;
.Hier ist ein weiterer Ansatz, bei dem Sie Ihre eigenen Markup-Erweiterungen definieren, die
True
oderFalse
(oder einen anderen gewünschten Wert) zurückgeben. Dann verwenden Sie sie einfach direkt in XAML wie jede andere Markup-Erweiterung:Sie verwenden sie dann folgendermaßen (vorausgesetzt, Ihr importierter Namespace ist
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}}">
Ich definiere tatsächlich viele benutzerdefinierte
MarkupExtension
Klassen für viele allgemeine Dinge, die ich nicht unbedingt in meinen Ressourcen speichern möchte.quelle