web-dev-qa-db-ja.com

XAMLのブールCommandParameter

私はこのコードを持っています(これはちょうどうまくいきます):

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

ここで、「s」はもちろんシステム名前空間です。

しかし、このコマンドはかなり頻繁に呼び出され、それ以外の場合はかなり単純なXAMLコードを実際に膨らませます。これは、XAMLのブールコマンドパラメーターの実際の最短表記ですか(コマンドをいくつかのコマンドに分割する以外)?

63
Matěj Zábský

これはちょっとしたハックかもしれませんが、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}"/>
90
H.B.

最も簡単な方法は、リソースで以下を定義することです

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

次のように使用します:

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

このマークアップ拡張機能を備えたさらに一般的なソリューションを見つけました。

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を取得することもできます。

22
Onur

または、多分それ:

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

Sは名前空間です。

 xmlns:s="clr-namespace:System;Assembly=mscorlib"
16
javicabanas

おそらく次のようなもの

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

ここで、StaticBoolean

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

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クラスを実際に定義しています。

1
MarqueIV