Thứ ba, ngày 6 tháng 12 năm 2016

WPF – MultiBinding và IMultiValueConverter

Ngày đăng: 26/3/2012, 8:39:12AM | Lượt xem: 4,572
Hot!

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.

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:

http://yinyangit.wordpress.com

Tham khảo thêm:

 Chia sẻ qua: 
Hot!
Ý kiến bạn đọc

These items will be permanently deleted and cannot be recovered. Are you sure?

Gallery

image

Maecenas viverra rutrum pulvinar

Maecenas viverra rutrum pulvinar! Aenean vehicula nulla sit amet metus aliquam et malesuada risus aliquet. Vestibulum rhoncus, dolor sit amet venenatis porta, metus purus sagittis nisl, sodales volutpat elit lorem…

Read more

Text Links

Thiết kế logo chuyên nghiệp Insky
DAFABET
W88 w88b.com/dang-ky-tai-khoan-w88
W88
Copyright © 2011 - 2012 vietshare.vn by phamkhuong102@gmail.com doanhkisi2315@gmail.com. All rights reserved.