WPF – MultiBinding và IMultiValueConverter

Nhiều trường hợp bạn cần binding dữ liệu từ nhiều nguồn khác nhau, ví dụ như tính giá trị trung bình từ nhiều control và hiển thị trên một TextBox. Trường hợp này, bạn cần dùng đến lớp MultiBinding đồng thời kết hợp với IMultiValueConverter để chuyển đổi dữ liệu thành dạng cần thiết.

Lớp MultiBinding chứa một collection các đối tượng Binding với property MultiBinding.Bindings. Bạn chỉ cần tạo các Binding thông thường rồi thêm vào collection này để tạo một MultiBinding.

Tương ứng với lớp MultiBinding, bạn cần tạo một lớp hiện thực từ IMultiValueConverter để thực hiện chuyển đổi dữ liệu từ nguồn sang đích và ngược lại.

–          Phương thức Convert() có tham số values là mảng chứa giá trị từ các source object. Bạn cần sử dụng mảng này để tổng hợp dữ liệu lại tạo nên một dữ liệu duy nhất để trả về cho target object.

–          Phương thức Convert() nhận tham số value là dữ liệu từ target object, bạn cần tách dữ liệu này ra thành một mảng để trả về cho các source object.

Một ví dụ đơn giản với hai source object là First Name và Last Name kiểu string, từ đó ta chuyển về target object là Full Name cũng có kiểu string.

public class NameConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        return values[0] + " " + values[1];
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        return ((string)value).Split(' ');
    }
}

Tập tin MainWindow.xaml:

<Window x:Class="MultiBindingDemo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:c="clr-namespace:MultiBindingDemo"
        Title=" MultiBinding Demo" Height="200" Width="400">
    <Window.Resources>
        <c:NameConverter x:Key="myNameConverter"/>
    </Window.Resources>

    <Grid Width="300" Height="100">
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <TextBlock>First Name:</TextBlock>
        <TextBlock Grid.Row="1" >Last Name:</TextBlock>
        <TextBlock Grid.Row="2" >Full Name:</TextBlock>

        <TextBox Name="txtFirstName" Grid.Column="1" >Yin</TextBox>
        <TextBox Name="txtLastName" Grid.Row="1" Grid.Column="1">Yang</TextBox>

        <TextBox Name="txtFullName" Grid.Row="2" Grid.Column="1">
            <TextBox.Text>
                <MultiBinding UpdateSourceTrigger="PropertyChanged" Converter="{StaticResource myNameConverter}">
                    <Binding ElementName="txtFirstName" Path="Text"/>
                    <Binding ElementName="txtLastName" Path="Text"/>
                </MultiBinding>
            </TextBox.Text>
        </TextBox>
    </Grid>
</Window>

Bạn cũng có thể tạo MultiBinding trong code-behind như sau:

MultiBinding binding = new MultiBinding();
binding.Bindings.Add(new Binding("Text") { Source = txtFirstName });
binding.Bindings.Add(new Binding("Text") { Source = txtLastName});

binding.Converter=new NameConverter();
binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;

txtFullName.SetBinding(TextBox.TextProperty, binding);

Đây là kiểu binding TwoWay, vì vậy bạn có thể thay đổi giá trị của txtFullName để các giá trị trong txtFirstName và txtLastName thay đổi theo:

https://yinyangit.wordpress.com

Tham khảo thêm:

Gửi phản hồi

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s