wpf 如何将整数作为ConverterParameter传递?

omvjsjqw  于 2022-11-18  发布在  其他
关注(0)|答案(5)|浏览(280)

我正在尝试绑定到整数属性:

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

问题是当我的转换器被调用时参数是字符串。我需要它是一个整数。当然我可以解析字符串,但是我必须这样做吗?
谢谢你的帮助,康斯坦丁

b1zrtrql

b1zrtrql1#

给你!

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

诀窍是包含基本系统类型的命名空间,然后至少以元素形式编写ConverterParameter绑定。

vu8f3i0k

vu8f3i0k2#

为了完整起见,还有一个可能的解决方案(可能需要更少的输入):

<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}}" />

(Of当然,Window可以用UserControl代替,并且IntZero可以被定义为更接近实际使用的位置。)

xriantvc

xriantvc3#

不知道为什么WPF的人往往不愿意使用MarkupExtension。它是许多问题的完美解决方案,包括这里提到的问题。

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命名空间' local: '中定义的,那么原始发布者的例子变成:

<RadioButton Content="None"
             IsChecked="{Binding MyProperty,
                         Converter={StaticResource IntToBoolConverter},
                         ConverterParameter={local:Int32 0}}" />

这是因为标记扩展解析器可以看到构造函数参数的强类型并进行相应的转换,而Binding的ConverterParameter参数是(信息较少的)Object类型的。

z6psavjg

z6psavjg4#

不要使用value.Equals。用途:

Convert.ToInt32(value) == Convert.ToInt32(parameter)
mutmk8jj

mutmk8jj5#

以某种方式用XAML表示ConverterValue的类型信息是很好的,但我认为目前还不可能。因此,我猜您必须通过一些自定义逻辑将Converter对象解析为您期望的类型。我看不到其他方法。

相关问题