詳解WPF中值轉(zhuǎn)換器的使用方法
什么是值轉(zhuǎn)換器
在WPF(Windows Presentation Foundation)中,值轉(zhuǎn)換器(Value Converter)是一種機(jī)制,允許你在綁定時(shí)轉(zhuǎn)換綁定源和綁定目標(biāo)之間的值。值轉(zhuǎn)換器實(shí)現(xiàn)了 IValueConverter
接口,該接口包含兩個(gè)方法:Convert
和 ConvertBack
。這兩個(gè)方法分別用于在綁定源到目標(biāo)時(shí)進(jìn)行值轉(zhuǎn)換,以及在目標(biāo)到源時(shí)進(jìn)行值轉(zhuǎn)換。
使用值轉(zhuǎn)換器的Demo
首先創(chuàng)建一個(gè)綁定數(shù)據(jù)源類(lèi):
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)); } } }
有一個(gè)類(lèi)型為DateTime
的屬性TheDate
,該類(lèi)實(shí)現(xiàn)了INotifyPropertyChanged
接口。
再創(chuàng)建一個(gè)轉(zhuǎn)換器類(lèi):
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; } }
該類(lèi)實(shí)現(xiàn)了IValueConverter
接口。
IValueConverter介紹
如果要將值轉(zhuǎn)換器與綁定相關(guān)聯(lián),請(qǐng)創(chuàng)建實(shí)現(xiàn) 接口的 IValueConverter 類(lèi), Convert 然后實(shí)現(xiàn) 和 ConvertBack 方法。 轉(zhuǎn)換器可以將數(shù)據(jù)從一種類(lèi)型更改為另一種類(lèi)型,根據(jù)文化信息轉(zhuǎn)換數(shù)據(jù),或修改演示文稿的其他方面。
值轉(zhuǎn)換器具有區(qū)域性感知能力。 Convert和 ConvertBack 方法都有一個(gè)culture
參數(shù),用于指示區(qū)域性信息。 如果區(qū)域性信息與轉(zhuǎn)換無(wú)關(guān),則可以在自定義轉(zhuǎn)換器中忽略該參數(shù)。
該接口有兩個(gè)方法Convert
與ConvertBack
。
public object Convert (object value, Type targetType, object parameter, System.Globalization.CultureInfo culture);
中各參數(shù)的含義如下所示:
參數(shù) | 類(lèi)型 | 含義 |
---|---|---|
value | object | 綁定源生成的值。 |
targetType | Type | 綁定目標(biāo)屬性的類(lèi)型。 |
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>
一個(gè)名為MyDataSource
類(lèi)型為MyData
的資源與一個(gè)名為MyConverterReference
類(lèi)型為MyConverter
的資源。
我們發(fā)現(xiàn)有三處地方用到了Binding
:
<Binding Source="{StaticResource MyDataSource}"/>
這種形式我們已經(jīng)見(jiàn)過(guò)了。
<TextBlock Name="myconvertedtext" Foreground="{Binding Path=TheDate, Converter={StaticResource MyConverterReference}}">
<Binding Path="TheDate" Converter="{StaticResource MyConverterReference}"/>
注意,這兩處Binding
中都出現(xiàn)了Converter
。
Converter介紹
通過(guò)實(shí)現(xiàn) IValueConverter 接口并實(shí)現(xiàn) Convert 方法創(chuàng)建轉(zhuǎn)換器。 該方法應(yīng)返回一個(gè)對(duì)象,該對(duì)象的類(lèi)型與綁定所面向的依賴(lài)屬性的類(lèi)型相同,或者至少返回一個(gè)可隱式強(qiáng)制轉(zhuǎn)換或轉(zhuǎn)換為目標(biāo)類(lèi)型的類(lèi)型。
再結(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ù)目標(biāo)類(lèi)型的不同,進(jìn)行不同的轉(zhuǎn)換。
TextBlock.Foreground
的類(lèi)型為Brush
就返回Brushes.Red
。
TextBlock.Text
的類(lèi)型為String
就返回date.ToString("F", culture)
。
結(jié)果如下圖所示:
Demo代碼來(lái)源
https://github.com/microsoft/WPF-Samples/tree/main/Data%20Binding/BindConversion
以上就是詳解WPF中值轉(zhuǎn)換器的使用方法的詳細(xì)內(nèi)容,更多關(guān)于WPF轉(zhuǎn)換器使用的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳談C# 圖片與byte[]之間以及byte[]與string之間的轉(zhuǎn)換
下面小編就為大家?guī)?lái)一篇詳談C# 圖片與byte[]之間以及byte[]與string之間的轉(zhuǎn)換。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02C#通過(guò)經(jīng)緯度計(jì)算2個(gè)點(diǎn)之間距離的實(shí)現(xiàn)代碼
這篇文章主要介紹了C#通過(guò)經(jīng)緯度計(jì)算2個(gè)點(diǎn)之間距離實(shí)現(xiàn)代碼,本文對(duì)實(shí)現(xiàn)原理、經(jīng)緯度基本知識(shí)等一并做了講解,需要的朋友可以參考下2014-08-08C#中參數(shù)個(gè)數(shù)可變的方法實(shí)例分析
這篇文章主要介紹了C#中參數(shù)個(gè)數(shù)可變的方法,以一個(gè)簡(jiǎn)單實(shí)例分析了C#中參數(shù)個(gè)數(shù)可變的方法,主要是使用params關(guān)鍵字來(lái)實(shí)現(xiàn)的,是C#編程中比較實(shí)用的技巧,需要的朋友可以參考下2014-11-11C#判斷一個(gè)字符串是否是數(shù)字或者含有某個(gè)數(shù)字的方法
這篇文章主要介紹了C#判斷一個(gè)字符串是否是數(shù)字或者含有某個(gè)數(shù)字的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-06-06關(guān)于C#10 新特性 Lambda 優(yōu)化
這篇文章主要介紹了C# 10 新特性 Lambda 優(yōu)化,C# 10 對(duì)于 Lambda 做了很多的優(yōu)化,我們可以在 C# 中更加方便地使用委托和 Lambda 了,下面就來(lái)看一些示例,需要的朋友也可以參考一下2021-11-11C#編程實(shí)現(xiàn)發(fā)送郵件的方法(可添加附件)
這篇文章主要介紹了C#編程實(shí)現(xiàn)發(fā)送郵件的方法,具備添加附件的功能,涉及C#文件傳輸及郵件發(fā)送的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11C#實(shí)現(xiàn)條形碼識(shí)別的解決方案分享
主流的識(shí)別庫(kù)主要有ZXing.NET和ZBar,OpenCV 4.0后加入了QR碼檢測(cè)和解碼功能,所以本文主要和大家分享了使用ZBar進(jìn)行條形碼識(shí)別的示例代碼,需要的可以參考一下2023-07-07