我有这个代码(工作正常):
<KeyBinding Key="Enter" Command="{Binding ReturnResultCommand}">
<KeyBinding.CommandParameter>
<s:Boolean>
True
</s:Boolean>
</KeyBinding.CommandParameter>
</KeyBinding>
其中“s”当然是系统命名空间。
但是这个命令被调用了很多次,它真的膨胀了相当简单的XAML代码。这是否是XAML中布尔命令参数的最短表示法(除了将命令拆分为多个命令之外)?
答案 0 :(得分:89)
这可能有点像黑客,但你可以从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}"/>
答案 1 :(得分:56)
最简单的方法是在参考资料
中定义以下内容<System:Boolean x:Key="FalseValue">False</System:Boolean>
<System:Boolean x:Key="TrueValue">True</System:Boolean>
并使用它:
<Button CommandParameter="{StaticResource FalseValue}"/>
答案 2 :(得分:21)
我刚刚找到了一个更通用的解决方案,使用了这个扩展标记:
.RadAjaxPanel
用法(&#34; wpf:&#34;是扩展所在的命名空间):
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;
}
}
您输入<KeyBinding Key="F8" Command="{Binding SomeCommand}" CommandParameter="{wpf:SystemType Bool=True}"/>
后输入True
和False
选项并输入安全性!
答案 3 :(得分:14)
或者,或许那样:
<Button.CommandParameter>
<s:Boolean>True</s:Boolean>
</Button.CommandParameter>
其中s是命名空间:
xmlns:s="clr-namespace:System;assembly=mscorlib"
答案 4 :(得分:6)
也许像
<KeyBinding Key="Enter" Command="{Binding ReturnResultCommand}"
CommandParameter="{x:Static StaticBoolean.True}" />
其中StaticBoolean
是
public static class StaticBoolean
{
public static bool True
{
get { return true; }
}
}
答案 5 :(得分:1)
这是另一种方法,您定义自己的标记扩展名,这些扩展名返回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
类。