詳解WPF中值轉(zhuǎn)換器的使用方法
什么是值轉(zhuǎn)換器
在WPF(Windows Presentation Foundation)中,值轉(zhuǎn)換器(Value Converter)是一種機制,允許你在綁定時轉(zhuǎn)換綁定源和綁定目標之間的值。值轉(zhuǎn)換器實現(xiàn)了 IValueConverter
接口,該接口包含兩個方法:Convert
和 ConvertBack
。這兩個方法分別用于在綁定源到目標時進行值轉(zhuǎn)換,以及在目標到源時進行值轉(zhuǎn)換。
使用值轉(zhuǎn)換器的Demo
首先創(chuàng)建一個綁定數(shù)據(jù)源類:
using System; using System.ComponentModel; ? namespace BindConversion { public class MyData : INotifyPropertyChanged { private DateTime _thedate; ? public MyData() { _thedate = DateTime.Now; } ? public DateTime TheDate { get { return _thedate; } set { _thedate = value; OnPropertyChanged("TheDate"); } } ? // Declare event public event PropertyChangedEventHandler PropertyChanged; // OnPropertyChanged method to update property value in binding private void OnPropertyChanged(string info) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(info)); } } }
有一個類型為DateTime
的屬性TheDate
,該類實現(xiàn)了INotifyPropertyChanged
接口。
再創(chuàng)建一個轉(zhuǎn)換器類:
using System; using System.Globalization; using System.Windows.Data; using System.Windows.Media; ? namespace BindConversion { public class MyConverter : IValueConverter { public object Convert(object o, Type type, object parameter, CultureInfo culture) { var date = (DateTime) o; switch (type.Name) { case "String": return date.ToString("F", culture); case "Brush": return Brushes.Red; default: return o; } } ? public object ConvertBack(object o, Type type, object parameter, CultureInfo culture) => null; } }
該類實現(xiàn)了IValueConverter
接口。
IValueConverter介紹
如果要將值轉(zhuǎn)換器與綁定相關(guān)聯(lián),請創(chuàng)建實現(xiàn) 接口的 IValueConverter 類, Convert 然后實現(xiàn) 和 ConvertBack 方法。 轉(zhuǎn)換器可以將數(shù)據(jù)從一種類型更改為另一種類型,根據(jù)文化信息轉(zhuǎn)換數(shù)據(jù),或修改演示文稿的其他方面。
值轉(zhuǎn)換器具有區(qū)域性感知能力。 Convert和 ConvertBack 方法都有一個culture
參數(shù),用于指示區(qū)域性信息。 如果區(qū)域性信息與轉(zhuǎn)換無關(guān),則可以在自定義轉(zhuǎn)換器中忽略該參數(shù)。
該接口有兩個方法Convert
與ConvertBack
。
public object Convert (object value, Type targetType, object parameter, System.Globalization.CultureInfo culture);
中各參數(shù)的含義如下所示:
參數(shù) | 類型 | 含義 |
---|---|---|
value | object | 綁定源生成的值。 |
targetType | Type | 綁定目標屬性的類型。 |
parameter | object | 要使用的轉(zhuǎn)換器參數(shù)。 |
culture | CultureInfo | 要用在轉(zhuǎn)換器中的區(qū)域性。 |
再看一下MainWindow.xaml:
<Window x:Class="BindConversion.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:BindConversion" mc:Ignorable="d" Title="MainWindow" Height="350" Width="525"> <StackPanel Width="300" Height="300" Name="Page1"> <StackPanel.Resources> <local:MyData x:Key="MyDataSource"/> <local:MyConverter x:Key="MyConverterReference"/> <Style TargetType="TextBlock"> <Setter Property="FontSize" Value="15"/> <Setter Property="Margin" Value="3"/> </Style> </StackPanel.Resources> ? <StackPanel.DataContext> <Binding Source="{StaticResource MyDataSource}"/> </StackPanel.DataContext> ? <TextBlock Text="Unconverted data:"/> <TextBlock Text="{Binding Path=TheDate}"/> <TextBlock Text="Converted data:"/> <TextBlock Name="myconvertedtext" Foreground="{Binding Path=TheDate, Converter={StaticResource MyConverterReference}}"> <TextBlock.Text> <Binding Path="TheDate" Converter="{StaticResource MyConverterReference}"/> </TextBlock.Text> </TextBlock> ? </StackPanel> </Window>
首先定義了資源:
<StackPanel.Resources> <local:MyData x:Key="MyDataSource"/> <local:MyConverter x:Key="MyConverterReference"/> <Style TargetType="TextBlock"> <Setter Property="FontSize" Value="15"/> <Setter Property="Margin" Value="3"/> </Style> </StackPanel.Resources>
一個名為MyDataSource
類型為MyData
的資源與一個名為MyConverterReference
類型為MyConverter
的資源。
我們發(fā)現(xiàn)有三處地方用到了Binding
:
<Binding Source="{StaticResource MyDataSource}"/>
這種形式我們已經(jīng)見過了。
<TextBlock Name="myconvertedtext" Foreground="{Binding Path=TheDate, Converter={StaticResource MyConverterReference}}">
<Binding Path="TheDate" Converter="{StaticResource MyConverterReference}"/>
注意,這兩處Binding
中都出現(xiàn)了Converter
。
Converter介紹
通過實現(xiàn) IValueConverter 接口并實現(xiàn) Convert 方法創(chuàng)建轉(zhuǎn)換器。 該方法應(yīng)返回一個對象,該對象的類型與綁定所面向的依賴屬性的類型相同,或者至少返回一個可隱式強制轉(zhuǎn)換或轉(zhuǎn)換為目標類型的類型。
再結(jié)合這段代碼:
public object Convert(object o, Type type, object parameter, CultureInfo culture) { var date = (DateTime) o; switch (type.Name) { case "String": return date.ToString("F", culture); case "Brush": return Brushes.Red; default: return o; } }
根據(jù)目標類型的不同,進行不同的轉(zhuǎn)換。
TextBlock.Foreground
的類型為Brush
就返回Brushes.Red
。
TextBlock.Text
的類型為String
就返回date.ToString("F", culture)
。
結(jié)果如下圖所示:
Demo代碼來源
https://github.com/microsoft/WPF-Samples/tree/main/Data%20Binding/BindConversion
以上就是詳解WPF中值轉(zhuǎn)換器的使用方法的詳細內(nèi)容,更多關(guān)于WPF轉(zhuǎn)換器使用的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳談C# 圖片與byte[]之間以及byte[]與string之間的轉(zhuǎn)換
下面小編就為大家?guī)硪黄斦凜# 圖片與byte[]之間以及byte[]與string之間的轉(zhuǎn)換。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02C#通過經(jīng)緯度計算2個點之間距離的實現(xiàn)代碼
這篇文章主要介紹了C#通過經(jīng)緯度計算2個點之間距離實現(xiàn)代碼,本文對實現(xiàn)原理、經(jīng)緯度基本知識等一并做了講解,需要的朋友可以參考下2014-08-08C#判斷一個字符串是否是數(shù)字或者含有某個數(shù)字的方法
這篇文章主要介紹了C#判斷一個字符串是否是數(shù)字或者含有某個數(shù)字的方法,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2018-06-06關(guān)于C#10 新特性 Lambda 優(yōu)化
這篇文章主要介紹了C# 10 新特性 Lambda 優(yōu)化,C# 10 對于 Lambda 做了很多的優(yōu)化,我們可以在 C# 中更加方便地使用委托和 Lambda 了,下面就來看一些示例,需要的朋友也可以參考一下2021-11-11C#編程實現(xiàn)發(fā)送郵件的方法(可添加附件)
這篇文章主要介紹了C#編程實現(xiàn)發(fā)送郵件的方法,具備添加附件的功能,涉及C#文件傳輸及郵件發(fā)送的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-11-11