Логический CommandParameter в XAML


У меня есть этот код (который работает правильно):

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

где "s" - Это, конечно, системное пространство имен.

но эта команда вызывается довольно много раз, и она действительно раздувает в противном случае довольно простой код XAML. Это действительно самая короткая нотация логического параметра команды в XAML (кроме разделения команды на несколько команд)?

5 51

5 ответов:

Я как-то не склонен читать вопросы... В любом случае, это может быть немного хак, но вы можете получить от 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;
    }
}

Usage ("wpf:" - это пространство имен, в котором находится расширение):

<KeyBinding Key="F8" Command="{Binding SomeCommand}" CommandParameter="{wpf:SystemType Bool=True}"/>

вы даже получаете варианты True и False после ввода Bool= и тип безопасности!

или, может быть, что:

<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; }
    }
}