WPF转换器 IValueConverter

转换器 IValueConverter 接口

定义:
提供将自定义逻辑应用于绑定的方法。

如果要将值转换器与绑定相关联,请创建一个实现接口的类继承IValueConverter,然后实现 Convert 和 ConvertBack 方法。 转换器可将数据从一种类型更改为另一种类型,根据区域性信息转换数据,或修改演示的其他方面。
值转换器识别区域性。 Convert和 ConvertBack 方法都有一个 culture 指示区域性信息的参数。 如果区域性信息与转换无关,则可在自定义转换器中忽略该参数。
Convert和 ConvertBack 方法也有一个名为parameter的参数, parameter 以便你可以使用具有不同参数的转换器的同一实例。 例如,你可以编写一个格式转换器,该转换器根据你使用的输入参数生成不同的数据格式。 您可以使用 ConverterParameter Binding 类的来将参数作为参数传递到 Convert 和 ConvertBack 方法。

方法:
Convert(Object, Type, Object, CultureInfo) 转换值。
ConvertBack(Object, Type, Object, CultureInfo) 转换值。

#region 程序集 PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
// C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\PresentationFramework.dll
#endregion

using System.Globalization;

namespace System.Windows.Data
{
    //
    // 摘要:
    //     提供将自定义逻辑应用于绑定的方法。
    public interface IValueConverter
    {
        //
        // 摘要:
        //     转换值。
        //
        // 参数:
        //   value:
        //     绑定源生成的值。
        //
        //   targetType:
        //     绑定目标属性的类型。
        //
        //   parameter:
        //     要使用的转换器参数。
        //
        //   culture:
        //     要用在转换器中的区域性。
        //
        // 返回结果:
        //     转换后的值。 如果该方法返回 null,则使用有效的 null 值。
        object Convert(object value, Type targetType, object parameter, CultureInfo culture);
        //
        // 摘要:
        //     转换值。
        //
        // 参数:
        //   value:
        //     绑定目标生成的值。
        //
        //   targetType:
        //     要转换为的类型。
        //
        //   parameter:
        //     要使用的转换器参数。
        //
        //   culture:
        //     要用在转换器中的区域性。
        //
        // 返回结果:
        //     转换后的值。 如果该方法返回 null,则使用有效的 null 值。
        object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture);
    }
}

继承IValueConverter接口:

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Windows.Data;

namespace ConverterDemo.Converter
{
    public class DateTimeConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}

Convert:

参数
value Object
绑定源生成的值。
targetType Type
绑定目标属性的类型。
parameter Object
要使用的转换器参数。
culture CultureInfo
要用在转换器中的区域性。

返回
Object
转换后的值。 如果该方法返回 null,则使用有效的 null 值。

注解
数据绑定引擎在将值从绑定源传播到绑定目标时会调用此方法。
数据绑定引擎不会捕获由用户提供的转换器引发的异常。 方法所引发的任何异常 Convert ,或方法调用的方法所引发的任何未捕获异常 Convert 均被视为运行时错误。 通过返回来处理预期问题 DependencyProperty.UnsetValue 。
的返回值 DependencyProperty.UnsetValue 指示转换器没有生成值,并且绑定将使用 FallbackValue (如果可用)或默认值。
返回值 Binding.DoNothing 指示绑定不传输值或使用 FallbackValue 或默认值。

示例:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;

namespace ConverterDemo
{
    public class ConverterViewModel : INotifyPropertyChanged
    {
        #region INotifyPropertyChanged
        public event PropertyChangedEventHandler PropertyChanged;

        public virtual void OnPropertyChanged(string propertyName)
        {
            var propertyChanged = PropertyChanged;

            if (propertyChanged != null)
            {
                propertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
        #endregion

        private DateTime _testDate;

        /// <summary>
        /// 测试数据
        /// </summary>
        public DateTime TestDate
        {
            get { return _testDate; }

            set
            {
                _testDate = value;
                OnPropertyChanged("TestDate");
            }
        }

    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

namespace ConverterDemo
{
    /// <summary>
    /// ConverterPage.xaml 的交互逻辑
    /// </summary>
    public partial class ConverterPage : Window
    {
        ConverterViewModel viewModel;
        public ConverterPage()
        {
            InitializeComponent();

            viewModel = new ConverterViewModel();
            this.DataContext = viewModel;
        }
    }
}
<Window x:Class="ConverterDemo.ConverterPage"
        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:ConverterDemo"
        mc:Ignorable="d"
        xmlns:converter ="clr-namespace:ConverterDemo.Converter"
        Title="ConverterPage" Height="450" Width="800">
    <Window.Resources>
        <converter:DateTimeConverter x:Key="DateTimeConverter"/>
    </Window.Resources>
    <Grid>
        <Label Content="使用转换器" HorizontalAlignment="Left" Margin="118,129,0,0" VerticalAlignment="Top"/>
        <Label Content="未使用转换器" HorizontalAlignment="Left" Margin="118,171,0,0" VerticalAlignment="Top"/>
        <TextBlock HorizontalAlignment="Left" Margin="279,134,0,0" TextWrapping="Wrap" 
                   Text="{Binding TestDate,Converter={StaticResource DateTimeConverter}}" VerticalAlignment="Top"/>
        <TextBlock HorizontalAlignment="Left" Margin="279,176,0,0" TextWrapping="Wrap" 
                   Text="{Binding TestDate}" VerticalAlignment="Top"/>
    </Grid>
</Window>
	public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value != null && DateTime.TryParse(value.ToString(), out DateTime result))
            {
                return result.ToString("yyyy-MM-dd");
            }

            return value;
        }

WPF转换器 IValueConverter

ConvertBack:

参数
value Object
绑定目标生成的值。
targetType Type
要转换为的类型。
parameter Object
要使用的转换器参数。
culture CultureInfo
要用在转换器中的区域性。

返回
Object
转换后的值。 如果该方法返回 null,则使用有效的 null 值。

注解
数据绑定引擎在将值从绑定目标传播到绑定源时调用此方法。
此方法的实现必须是方法的反向实现 Convert 。
数据绑定引擎不会捕获由用户提供的转换器引发的异常。 方法所引发的任何异常 ConvertBack ,或方法调用的方法所引发的任何未捕获异常 ConvertBack 均被视为运行时错误。 通过返回来处理预期 DependencyProperty 问题。 UnsetValue
的返回值 DependencyProperty.UnsetValue 指示转换器没有生成值,并且绑定将使用 FallbackValue (如果可用)或默认值。
返回值 Binding.DoNothing 指示绑定不传输值或使用 FallbackValue 或默认值。

代码:


上一篇:WPF 布局 在有限空间内让两个元素尽可能撑开的例子


下一篇:基于MaterialDesign和MVVM框架搭建的wpf开源项目