可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I have this code (which works just right):
<KeyBinding Key="Enter" Command="{Binding ReturnResultCommand}">
<KeyBinding.CommandParameter>
<s:Boolean>
True
</s:Boolean>
</KeyBinding.CommandParameter>
</KeyBinding>
Where "s" is of course the System namespace.
But this command is called quite a few times and it really inflates otherwise rather simple XAML code. Is this really the shortest notation of boolean command parameter in XAML (other than splitting the command into several commands)?
回答1:
This might be a bit of a hack but you can derive from the KeyBinding
class:
public class BoolKeyBinding : KeyBinding
{
public bool Parameter
{
get { return (bool)CommandParameter; }
set { CommandParameter = value; }
}
}
Usage:
<local:BoolKeyBinding ... Parameter="True"/>
And another not so weird solution:
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>
Usage:
<KeyBinding ... CommandParameter="{StaticResource True}"/>
回答2:
The easiest is to define the following in the Resources
<System:Boolean x:Key="FalseValue">False</System:Boolean>
<System:Boolean x:Key="TrueValue">True</System:Boolean>
and use it like:
<Button CommandParameter="{StaticResource FalseValue}"/>
回答3:
I just found an even more generic solution with this markup extension:
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:" is the namespace where the extension lives in):
<KeyBinding Key="F8" Command="{Binding SomeCommand}" CommandParameter="{wpf:SystemType Bool=True}"/>
You even get the options True
and False
after typing Bool=
and type safety!
回答4:
Or, maybe that:
<Button.CommandParameter>
<s:Boolean>True</s:Boolean>
</Button.CommandParameter>
Where s is the namespace:
xmlns:s="clr-namespace:System;assembly=mscorlib"
回答5:
Perhaps something like
<KeyBinding Key="Enter" Command="{Binding ReturnResultCommand}"
CommandParameter="{x:Static StaticBoolean.True}" />
where StaticBoolean
is
public static class StaticBoolean
{
public static bool True
{
get { return true; }
}
}
回答6:
Here's another approach where you define your own markup extensions that return True
(or False
). Then you simply use them right in XAML like any other markup extension:
public class TrueExtension : MarkupExtension {
public override object ProvideValue(IServiceProvider serviceProvider) => true;
}
public class FalseExtension : MarkupExtension {
public override object ProvideValue(IServiceProvider serviceProvider) => false;
}
You then use them like this (assuming your imported namespace is abc
):
Visibility="{Binding SomeProperty, Converter={SomeConverter}, ConverterParameter={abc:True}}">