83

我有这个代码(它工作得很好):

<KeyBinding Key="Enter" Command="{Binding ReturnResultCommand}">
    <KeyBinding.CommandParameter>
        <s:Boolean>
            True
        </s:Boolean>
    </KeyBinding.CommandParameter>
</KeyBinding>

其中“s”当然是系统命名空间。

但是这个命令被调用了很多次,它确实膨胀了原本相当简单的 XAML 代码。这真的是 XAML 中布尔命令参数的最短表示法(​​除了将命令拆分为多个命令)吗?

4

6 回答 6

118

这可能有点小技巧,但您可以从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}"/>
于 2011-02-14T21:48:09.390 回答
70

最简单的方法是在资源中定义以下内容

<System:Boolean x:Key="FalseValue">False</System:Boolean>
<System:Boolean x:Key="TrueValue">True</System:Boolean>

并像这样使用它:

<Button CommandParameter="{StaticResource FalseValue}"/>
于 2012-11-09T17:47:25.810 回答
28

或者,也许是:

<Button.CommandParameter>
    <s:Boolean>True</s:Boolean>
</Button.CommandParameter>

其中 s 是命名空间:

 xmlns:s="clr-namespace:System;assembly=mscorlib"
于 2014-08-29T10:53:49.440 回答
26

我刚刚找到了一个使用这个标记扩展的更通用的解决方案:

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

您甚至可以在输入和输入安全后True获得选项!FalseBool=

于 2015-08-13T16:31:29.583 回答
6

也许像

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

StaticBoolean在哪里

public static class StaticBoolean
{
    public static bool True
    {
        get { return true; }
    }
}
于 2011-02-14T21:40:07.207 回答
1

这是另一种方法,您可以定义自己的返回TrueFalse(或您希望的任何其他值)的标记扩展。然后,您只需像任何其他标记扩展一样在 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我实际上为很多我不想存储在我的资源中的常见事物定义了很多自定义类。

于 2019-01-04T05:49:49.790 回答