分享

C# IValueConverter接口用法举例

 ontheroad96j47 2022-01-30

01

介绍

IValueConverter接口位于名称空间System.Windows.Data,接口定义了ConvertConvertBack两组方法:

    public interface IValueConverter    {        object Convert(object value, Type targetType, object parameter, CultureInfo culture);        object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture);    }}

在界面控件所需数据类型或格式和后台绑定的数据不一致时,往往需要借助IValueConverter接口进行转换。

02


举例

  •   界面添加一个表格控件datagrid,绑定数据结构StudentList,StudentList这是一个ObservableCollection<Students>集合;

  • Students数据模型定义如下:其中重写了ToString方法,并定义了四个属性,分别是Id,Name ,Age 和AgeValidate ,AgeValidate 用来验证数据,即年龄小于16或者大于21,时界面字体显示红色

     [AddINotifyPropertyChangedInterface]    public class Students     {        private int id;        public int Id        {            get { return id; }            set            {                id = value;            }        }        public string Name { get; set; }
    private int age; public int Age { get { return age; } set { age = value; if(age < 16 || age > 21 ) { AgeValidate = true; } else { AgeValidate = false; } } }
    public bool AgeValidate { get; set; } public override string ToString() { StringBuilder report = new StringBuilder(); report.AppendLine($"[Id] = [{Id}]"); report.AppendLine($"[Name] = [{Name}]"); report.AppendLine($"[Age] = [{Age}]"); report.AppendLine($"[AgeValidate] = [{AgeValidate}]"); return report.ToString(); } }

界面前台绑定:主要是通过这句

 Foreground="{Binding AgeValidate,Converter={StaticResource ShowColorConverter}}"

datagrid全部的代码如下:

 <DataGrid Name="dgSourceData" AutoGenerateColumns="False" ItemsSource="{Binding StudentList}"                   ContextMenu="{Binding menu1}" RowHeaderWidth="30"  SelectedItem ="{Binding SelectedItems}" SelectionMode="Single" SelectionUnit="Cell"                                cal:Message.Attach="[Event SelectionChanged]=[GridControl_SelectionChanged($source,$eventArgs)];"                                CellEditEnding="dgSourceData_BeginningEdit" SelectionChanged="dgSourceData_SelectionChanged" >            <DataGrid.Columns>                <DataGridTextColumn Header="Name"  Binding="{ Binding Path=Name}" MinWidth="68"/>                <DataGridTemplateColumn  Header="Age"  MinWidth="68" >                    <DataGridTemplateColumn.CellTemplate>                        <DataTemplate>                            <TextBox Text="{Binding Path=Age,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"                                      Foreground="{Binding AgeValidate,Converter={StaticResource ShowColorConverter}}" />                        </DataTemplate>                    </DataGridTemplateColumn.CellTemplate>                </DataGridTemplateColumn>                <DataGridTextColumn Header="Id"  Binding="{ Binding Path=Id}" MinWidth="48"/>            </DataGrid.Columns>        </DataGrid>

定义资源

    <UserControl.Resources>        <converters:ShowColorConverter x:Key="ShowColorConverter" />    </UserControl.Resources>
  • IValueConverter接口实现:注意需要将object类型的value转换为我们的目标类型bool量

    public class ShowColorConverter : IValueConverter    {        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)        {            var flag = (bool)value;            if (flag)            {                return "Red";            }            else            {                return "Black";            }        }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } }

03


运行演示

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多