如何传递一个整数作为ConverterParameter?
我想绑定到一个整数属性:
<RadioButton Content="None" IsChecked="{Binding MyProperty, Converter={StaticResource IntToBoolConverter}, ConverterParameter=0}" />
我的转换器是:
[ValueConversion(typeof(int), typeof(bool))] public class IntToBoolConverter : IValueConverter { public object Convert(object value, Type t, object parameter, CultureInfo culture) { return value.Equals(parameter); } public object ConvertBack(object value, Type t, object parameter, CultureInfo culture) { return value.Equals(false) ? DependencyProperty.UnsetValue : parameter; } }
问题是,当我的转换器被称为参数是string。 我需要它是一个整数。 当然,我可以parsingstring,但是我必须?
感谢任何帮助konstantin
这里你去!
<RadioButton Content="None" xmlns:sys="clr-namespace:System;assembly=mscorlib"> <RadioButton.IsChecked> <Binding Path="MyProperty" Converter="{StaticResource IntToBoolConverter}"> <Binding.ConverterParameter> <sys:Int32>0</sys:Int32> </Binding.ConverterParameter> </Binding> </RadioButton.IsChecked> </RadioButton>
诀窍是包含基本系统types的名称空间,然后至less以元素forms写入ConverterParameter绑定。
为了完整起见,还有一个可能的解决scheme(可能用更less的input):
<Window xmlns:sys="clr-namespace:System;assembly=mscorlib" ...> <Window.Resources> <sys:Int32 x:Key="IntZero">0</sys:Int32> </Window.Resources> <RadioButton Content="None" IsChecked="{Binding MyProperty, Converter={StaticResource IntToBoolConverter}, ConverterParameter={StaticResource IntZero}}" />
(当然, Window
可以replace为UserControl
, IntZero
可以定义成更接近实际使用的地方。)
不知道为什么WPF
人往往不喜欢使用MarkupExtension
。 这是包括这里提到的问题在内的许多问题的完美解决scheme。
public sealed class Int32Extension : MarkupExtension { public Int32Extension(int value) { this.Value = value; } public int Value { get; set; } public override Object ProvideValue(IServiceProvider sp) { return Value; } };
如果这个标记扩展在XAML
命名空间“m”中可用,那么原始的海报示例变成:
<RadioButton Content="None" IsChecked="{Binding MyProperty, Converter={StaticResource IntToBoolConverter}, ConverterParameter={m:Int32 0}}" />
这是可行的,因为标记扩展parsing器可以看到构造函数参数的强types并进行相应的转换,而Binding的ConverterParameter参数是(较less信息的)对象types。
不要使用value.Equals
。 使用:
Convert.ToInt32(value) == Convert.ToInt32(parameter)
在XAML中以某种方式表示ConverterValue的types信息会很好,但我不认为现在是可能的。 所以我想你必须通过一些自定义的逻辑来将Converter Objectparsing为你想要的types。 我没有看到另一种方式。