Логический CommandParameter в XAML - PullRequest
59 голосов
/ 15 февраля 2011

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

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

Где "s" - это, конечно, пространство имен Системы.

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

Ответы [ 6 ]

89 голосов
/ 15 февраля 2011

Это может быть немного хакерской, но вы можете получить от 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}"/>
56 голосов
/ 09 ноября 2012

Самое простое - определить следующее в Ресурсах

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

и использовать его следующим образом:

<Button CommandParameter="{StaticResource FalseValue}"/>
22 голосов
/ 13 августа 2015

Я только что нашел еще более общее решение с этим расширением разметки:

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= и ввода безопасности!

16 голосов
/ 29 августа 2014

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

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

Где s - пространство имен:

 xmlns:s="clr-namespace:System;assembly=mscorlib"
6 голосов
/ 15 февраля 2011

Возможно что-то вроде

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

, где StaticBoolean равно

public static class StaticBoolean
{
    public static bool True
    {
        get { return true; }
    }
}
1 голос
/ 04 января 2019

Вот еще один подход, в котором вы определяете свои собственные расширения разметки, которые возвращают 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 классов для множества общих вещей, которые я не хочу хранить в своих ресурсах.

...