XAML中的布尔CommandParameter


76

我有以下代码(工作正常):

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

当然,“ s”是系统名称空间。

但是此命令被调用了好几次,并且实际上会使其他相当简单的XAML代码膨胀。这真的是XAML中布尔命令参数的最短表示法(​​除了将命令分成几个命令之外)吗?

Answers:


108

这可能有点hack,但是您可以从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}"/>

它不仅适用于KeyBindings,而且适用于Button等。
马捷Zábský

那我刚刚添加的第二种方法呢?
HB

1
有趣的主意,这对我而言并没有。我会尝试。
马捷Zábský

@HB为什么我的总是返回false?我无法使它正常工作。
伊戈尔(Igor)2014年

2
:@HB尼斯的答案,也许你可以添加这个xmlns:s="clr-namespace:System;assembly=mscorlib"到你的答案:)
BendEg

63

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

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

并像这样使用它:

<Button CommandParameter="{StaticResource FalseValue}"/>

4
并且您需要xmlns:System="clr-namespace:System;assembly=mscorlib"在用户控件中添加:
Alex

26

或者,也许是这样:

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

其中s是名称空间:

 xmlns:s="clr-namespace:System;assembly=mscorlib"

24

我刚刚发现了带有此标记扩展的更通用的解决方案:

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并且False在键入Bool=和键入安全性之后!


据我所知,@ marbel82可以以与“属性”相同的方式省略“扩展名”。自己尝试!但是添加扩展名当然不会受到伤害。
Onur 2016年

奥努尔你是对的!我不知道 您应该在答案中写下此信息。以前我测试过您的代码,但在其他地方却犯了一个错误。
marbel82 '16

1
太光滑了,病了。感谢您的解决方案。
约翰·苏利

1
只需为每个类型创建一个markupextension(例如BooleanExtension),您就可以编写CommandParameter={x:Boolean True}类似于 docs.microsoft.com/en-us/dotnet/framework/xaml-services/…–
Wouter,

6

也许像

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

这里StaticBoolean

public static class StaticBoolean
{
    public static bool True
    {
        get { return true; }
    }
}

是。该值作为字符串传递到命令中(这也不是我想要的)。
马捷Zábský

嗯,在这种情况下我将如何使用转换器?
马捷Zábský

对不起,发现了一些简单的东西。
Bala R

1
我必须说,这是一个有趣的演变,看到了所有步骤:P现在到了布尔资源(您也可以在Xaml中做到这一点,就像我的回答一样)
HB

我真的很喜欢您的解决方案。我建议稍作改进。而不是get简单地初始化一个常量public static bool True = true;并添加另一个常量public static bool False = false;
marbel82 '16

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,我为许多我不想存储在资源中的常见事物定义了许多自定义类。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.