【WPF】wpf用MultiBinding解决Converter需要动态传参的问题,以Button为例

      用Binding并通过Converter转换的时候,可能偶尔会遇到传参的问题,一般通过设置xaml中的BindingParameter属性来给Converter传递参数。

      但是这个BindingParameter只支持已经定义好的资源类型(Resource),不支持int,Object等类型,在BindingParameter中也无法再次通过Binding的方法动态赋值。所以,折腾来折腾去还不如用MultiBinding得了。


1.XAML中的使用。

                        <Button  Margin="20,0"  Style="{StaticResource btnRecomendStyle}" >
                            <Button.Content>
                                <MultiBinding Converter="{StaticResource bool_PercentToStringConverter}">
                                    <Binding Path="IsTest"></Binding>
                                    <Binding Path="TestPercent"></Binding>
                                </MultiBinding>
                            </Button.Content>
                            <Button.Command>
                                <MultiBinding Converter="{StaticResource bool_PercentToCommandConverter}">
                                    <Binding Path="IsTest"></Binding>
                                    <Binding Path="TestPercent"></Binding>
                                </MultiBinding>
                            </Button.Command>
                        </Button>
Button的Content和Command都进行了两个绑定,这两个绑定将作为下面Converter类Object[]中的两个参数。

2.定义MultiConverter类,bool_PercentToStringConverter:

 class Bool_PercentToStringConverter : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            bool b;
            int Percent;
            Boolean.TryParse(values[0].ToString(), out b);
            Int32.TryParse(values[1].ToString(), out Percent);
            if (b)
            {
                if (Percent < 100)
                {
                    return Application.Current.FindResource("IDS_CANCEL");
                }
                else
                {
                    return Application.Current.FindResource("IDS_DONE");
                }
            }
            else
            {
                return Application.Current.FindResource("IDS_TEST");
            }
        }

        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
        
    }
这里不再实现IValueConverter接口,而是实现IMultiValueConverter。Object[] values里保存的就是传入的两个Binding。


WPFMultiBinding和IMultiValueConverter可以方便地实现多个控件的绑定,而Command可以让我们在MVVM模式下更好地控制交互逻辑。下面就介绍一下它们的使用方法。 MultiBinding用法 MultiBinding可以绑定多个数据源到一个控件上,例如TextBox控件可以同时绑定两个属性,分别是Text和Foreground。使用方式如下: ```xml <TextBox> <TextBox.Text> <MultiBinding Converter="{StaticResource MyMultiValueConverter}"> <Binding Path="Name"/> <Binding Path="Age"/> </MultiBinding> </TextBox.Text> <TextBox.Foreground> <MultiBinding Converter="{StaticResource MyMultiValueConverter}"> <Binding Path="Name"/> <Binding Path="Age"/> </MultiBinding> </TextBox.Foreground> </TextBox> ``` 上面的例子中,我们定义了一个MultiBinding并将两个Binding绑定到它上面,然后分别绑定到TextBox的Text和Foreground属性上。这样就可以同时绑定多个属性了。 IMultiValueConverter用法 IMultiValueConverter是一个接口,它可以将多个值转换成一个值。使用方式如下: ```csharp public class MyMultiValueConverter : IMultiValueConverter { public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { // 将多个值转换成一个值 // ... } public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) { // 将一个值转换成多个值 // ... } } ``` 上面的例子中,我们定义了一个MyMultiValueConverter类实现IMultiValueConverter接口,然后在Convert方法中将多个值转换成一个值。如果需要将一个值转换成多个值,可以在ConvertBack方法中实现。 搭配Command使用 在MVVM模式下,通常使用Command来控制交互逻辑。在使用MultiBinding和IMultiValueConverter时,我们可以将多个值传递给Command,例如: ```xml <Button Content="保存" Command="{Binding SaveCommand}"> <Button.CommandParameter> <MultiBinding Converter="{StaticResource MyMultiValueConverter}"> <Binding Path="Name"/> <Binding Path="Age"/> </MultiBinding> </Button.CommandParameter> </Button> ``` 上面的例子中,我们定义了一个Button控件,并将SaveCommand绑定到它上面。然后将多个Binding绑定到MultiBinding上,并将MultiBinding作为CommandParameter传递给Command。在Command执行时,就可以通过CommandParameter获取到多个值了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JimCarter

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值