WPF: Sử dụng ValueConverter

ValueConverter cho phép chuyển kiểu trực tiếp trong binding của XAML.

Một ví dụ về ValueConverter: chuyển đổi từ bool sang chuỗi


public class BoolToSex : IValueConverter
     {
         public object Convert(object value, Type targetType, object param, CultureInfo culture)
         {
             if (value!=null)
                 return ((bool)value)?"Nam":"Nữ";
             else
                 return "";
         }

         public object ConvertBack(object value, Type targetType, object param, CultureInfo culture)
         {
             string s=(value!=null)?(string)value:"";
             if (s=="Nam")
                 return true;
             else if (s=="Nữ")
                 return false;
             else
                 return null;
         }

Trong XAML phải khai báo converter là một resource:


     xmlns:local="clr-namespace:ValueConverter">
     <Window.Resources>
         <local:BoolToSex x:Key="BoolToSexConverter"/>
     </Window.Resources>

Sau đó có thể sử dụng Resource:


<ComboBox Grid.Row="0" Name="cmbGioiTinh" Width="100" Height="30" SelectedValue="{Binding SelectedValue, Converter={StaticResource BoolToSexConverter}, ElementName=cmbBool}"/>
         <ComboBox Grid.Row="1" Name="cmbBool" Width="100" Height="30"/>

Lưu ý:

Ta dùng hai combo: cmbGioiTinh với SelectedValue là chuỗi (Nam hoặc Nữ) và combo cmbBool với SelectedValue là bool (true hoặc false) và chiều thuận của Converter của ta chuyển từ bool sang string (để ý method Convert) do đó converter được dùng trong cmbGioiTinh để nhận SelectedValue kiểu bool của cmbBool và chuyển thành string cho SelectedValue của cmbGioiTinh.

Mã đầy đủ MainWindow.XAML:


<Window x:Class="ValueConverter.Window1"
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     Title="ValueConverter" Height="300" Width="300"
     xmlns:local="clr-namespace:ValueConverter"
     >
     <Window.Resources>
         <local:BoolToSex x:Key="BoolToSexConverter"/>
     </Window.Resources>
     <Grid>
         <Grid.RowDefinitions>
             <RowDefinition/>
             <RowDefinition/>
         </Grid.RowDefinitions>
         <ComboBox Grid.Row="0" Name="cmbGioiTinh" Width="100" Height="30" SelectedValue="{Binding SelectedValue, Converter={StaticResource BoolToSexConverter}, ElementName=cmbBool}"/>
         <ComboBox Grid.Row="1" Name="cmbBool" Width="100" Height="30"/>
     </Grid>
 </Window>

Mã đầy đủ MainWindows.xaml.cs:


using System.Collections.Generic;
using System.Windows;

 namespace ValueConverter
 {
public partial class Window1 : Window
     {
         public Window1()
         {
             InitializeComponent();
             cmbGioiTinh.ItemsSource=new List<string>(){"Nam","Nữ"};
             cmbBool.ItemsSource=new List<bool>(){false, true};
             cmbBool.SelectedValue=0;
         }
     }
 }

Mã đầy đủ BoolToSex:


using System;
 using System.Windows.Data;
 using System.Globalization;

 namespace ValueConverter
 {
     /// <summary>
     /// Chuyển đổi từ bool thành chuỗi Nam hoặc Nữ
     /// </summary>
     public class BoolToSex : IValueConverter
     {
         public object Convert(object value, Type targetType, object param, CultureInfo culture)
         {
             if (value!=null)
                 return ((bool)value)?"Nam":"Nữ";
             else
                 return "";
         }

         public object ConvertBack(object value, Type targetType, object param, CultureInfo culture)
         {
             string s=(value!=null)?(string)value:"";
             if (s=="Nam")
                 return true;
             else if (s=="Nữ")
                 return false;
             else
                 return null;
         }
     }
 }

Advertisements

Trả lờ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 Đăng xuất / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Đăng xuất / Thay đổi )

Connecting to %s