WPF 格式化輸出- IValueConverter接口的使用
(2012-06-11 00:14:00) 轉自: http://blog.sina.com.cn/s/blog_4b0020f301014flr.html Convert 原資料轉換為目标資料格式 ConvertBack目标資料格式轉換為原資料格式
以前在用ASP.NET 做B/S系統時,可以友善地在GRIDVIEW DATAList等資料控件中,使用自定義的代碼邏輯,比如
使用 <%# GetBalance(custID) %> 這樣的調用, GetBalance()為在codebehind類中定義的方法;
在WPF應用程式中有時也有類似的需求,比如資料庫表Teacher中有一個字段 Title ,int 類型,取值為1-5,分别對應講師 研究員 高工 副教授 教授。在wpf視窗中需要直接顯示 講師 研究員類似的文字,而不是一個1-5的數字,從界面設計的角度 ,用文字來表示職稱是最自然的方式。是以在資料綁定的時候需要将整數轉換為對應的文本職稱。但是WPF沒有象ASP。NET那樣的綁定表達式用法;該怎麼辦呢?
WPF架構提供了一個IValueConverter接口,負責資料源到資料控件綁定時,自定義轉換邏輯。使用它包括以下步驟:
1.建立一個隻轉換器類,實作該接口;
2.給該類加入ValueConversion屬性,并制定源類型和目标類型;
3.實作該接口的兩個方法,Convert()與ConvertBack()
4.按照1-3建立類之後,在資料綁定控件中,設定Converter為該類的一個執行個體;
具體要完成上述功能:
1.首先建立實作 IValueConverter的類:
//指定轉換器源類型和目标類型
[ValueConversion(typeof(int), typeof(string))]
public class TitleConverter:IValueConverter
{
//實作接口的兩個方法
#region IValueConverter 成員
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
int titleInt = (int)value;
string titleStr = string.Empty;
switch (titleInt)
{
case 5:
titleStr = "教授";
break;
case 4:
titleStr = "副教授";
break;
case 3:
titleStr = "高工";
break;
case 2:
titleStr = "研究員";
break;
case 1:
titleStr = "講師";
break;
}
return titleStr;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
string titleStr = value.ToString();
int titleInt = 0;
switch (titleStr)
{
case "教授":
titleInt = 5;
break;
case "副教授":
titleInt = 4;
break;
case "高工":
titleInt = 3;
break;
case "研究員":
titleInt = 2;
break;
case "講師":
titleInt = 1;
break;
}
return titleInt;
}
#endregion
}
2.前台調用
首先需要在視窗中聲明轉換器類名稱空間 并定義一個轉換器資源
<Window x:Class="EvalStarServer.UserManage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:EvalStarServer.BLL"
Title="UserManage" >
<Window.Resources>
<local:TitleConverter x:Key="myTitleConverter"></local:TitleConverter>
</Window.Resources>
<DataGrid Name="gdEvaluator" CanUserAddRows="False">
<DataGrid.Columns>
<DataGridTextColumn Header="姓名" Binding="{Binding Path=Name}"></DataGridTextColumn>
<DataGridTextColumn Header="職稱" Binding="{Binding Path=Elevel,Converter={StaticResource myTitleConverter}}"></DataGridTextColumn>
<DataGridTextColumn Header="編号" Binding="{Binding Path=Eno}"></DataGridTextColumn>
<DataGridTemplateColumn Header="操作">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Tag="{Binding Path=ID}" Click="OnDeleteEvl">删除</Button>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Windows>
這樣就實作了前台根據資料中的整數 顯示不同的職稱。