WPF学习笔记20 BookDemo6

多绑定

        Binding 是可用于数据绑定的类之一。BindingBase是所有绑定的抽象基类,有不同的具体实现方式。除了Binding之外还有MultiBinding和PriorityBinding。MultiBinding允许把一个WPF元素绑定到多个源上。例如,Person类有LastName和FirstName属性。把这两个属性绑定到一个wpf元素上会比较有趣:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BooksDemo.Models
{
    public class Person
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }
}

        对于MultiBinding,标记扩展不可用------因此必须用XAML元素语法来制定绑定。MulBinding的子元素是指定绑定到各种属性上的Binding元素。之类使用了LastName和FirstName属性。数据上下文用Grid元素设置。以便引用person1资源。

        为了把属性连接在一起,MultiBinding使用一个Converter把多个值转换为一个。这个转换器使用一个参数,并可以根据参数进行不同的转换:

    <Window.Resources>
        <local:Person x:Key="person1" FirstName="Tom" LastName="Turbo" />
        <local:PersonNameConverter x:Key="personNameConverter" />
    </Window.Resources>
    <Grid DataContext="{StaticResource person1}">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        <TextBox>
            <TextBox.Text>
                <MultiBinding Converter="{StaticResource personNameConverter}"  >
                    <MultiBinding.ConverterParameter>
                        <sys:String>FirstLast</sys:String>
                    </MultiBinding.ConverterParameter>
                    <Binding Path="FirstName" />
                    <Binding Path="LastName" />
                </MultiBinding>
            </TextBox.Text>
        </TextBox>

        多只转换器实现IMuitIValueConverter接口。这个接口定义了两个方法:Convert和ConvertBack()。Convert()方法通过第一个参数从数据源中接受多个值,并把一个值返回给目标。在实现代码中根据参数值是FirstName还是LastName,生成不同的结果

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;

namespace MultiBindingSample
{
    public class PersonNameConverter : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            switch (parameter as string)
            {
                case "FirstLast":
                    return values[0] + " " + values[1];
                case "LastFirst":
                    return values[1] + ", " + values[0];
                default:
                    throw new ArgumentException($"invalid argument {parameter}");
            }
        }

        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
        {
            throw new NotSupportedException();
        }

    }
}

        在这个简单的情形中,只把一些字符串与MultiBinding合并起来,并不需要实现IMultiValueConverter,顶一个格式字符串就足够了。用multiBinding定义的格式字符串首先需要一个{}前缀。在XAML中,花括号通常定义一个标记表达式。把{}作用前缀会转义这个符号,,不定义标记表达式,而是表示它后面的是一个通用的字符串。该实例指定,两个Binding元素用一个逗号和一个空白分隔开

        <TextBox Grid.Row="1">
            <TextBox.Text>
                <MultiBinding StringFormat="{}{0}, {1}">
                    <Binding Path="LastName" />
                    <Binding Path="FirstName" />
                </MultiBinding>
            </TextBox.Text>
        </TextBox>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值