私はこのコードを持っています(これはちょうどうまくいきます):
<KeyBinding Key="Enter" Command="{Binding ReturnResultCommand}">
<KeyBinding.CommandParameter>
<s:Boolean>
True
</s:Boolean>
</KeyBinding.CommandParameter>
</KeyBinding>
ここで、「s」はもちろんシステム名前空間です。
しかし、このコマンドはかなり頻繁に呼び出され、それ以外の場合はかなり単純なXAMLコードを実際に膨らませます。これは、XAMLのブールコマンドパラメーターの実際の最短表記ですか(コマンドをいくつかのコマンドに分割する以外)?
これはちょっとしたハックかもしれませんが、KeyBinding
クラスから派生できます。
public class BoolKeyBinding : KeyBinding
{
public bool Parameter
{
get { return (bool)CommandParameter; }
set { CommandParameter = value; }
}
}
使用法:
<local:BoolKeyBinding ... Parameter="True"/>
そして別のそれほど奇妙ではない解決策:
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>
使用法:
<KeyBinding ... CommandParameter="{StaticResource True}"/>
最も簡単な方法は、リソースで以下を定義することです
<System:Boolean x:Key="FalseValue">False</System:Boolean>
<System:Boolean x:Key="TrueValue">True</System:Boolean>
次のように使用します:
<Button CommandParameter="{StaticResource FalseValue}"/>
このマークアップ拡張機能を備えたさらに一般的なソリューションを見つけました。
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;
}
}
使用法(「wpf:」は拡張機能が存在する名前空間です):
<KeyBinding Key="F8" Command="{Binding SomeCommand}" CommandParameter="{wpf:SystemType Bool=True}"/>
Bool=
を入力してタイプセーフティを入力した後、オプションTrue
およびFalse
を取得することもできます。
または、多分それ:
<Button.CommandParameter>
<s:Boolean>True</s:Boolean>
</Button.CommandParameter>
Sは名前空間です。
xmlns:s="clr-namespace:System;Assembly=mscorlib"
おそらく次のようなもの
<KeyBinding Key="Enter" Command="{Binding ReturnResultCommand}"
CommandParameter="{x:Static StaticBoolean.True}" />
ここで、StaticBoolean
は
public static class StaticBoolean
{
public static bool True
{
get { return true; }
}
}
True
またはFalse
(または他の任意の値)を返す独自のマークアップ拡張機能を定義する別のアプローチがあります。次に、他のマークアップ拡張機能と同様にXAMLでそれらを使用します。
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;
}
次に、これらを次のように使用します(インポートしたネームスペースが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}}">
私は実際にリソースに保存したくない多くの一般的なもののために、多くのカスタムMarkupExtension
クラスを実際に定義しています。