wpf转换器Converter使用举例 Converter的双向赋值

近期在项目希望实现 编辑值与原始数据的 双向转换。 经过调试,这才发现Converter自带该功能。 以下是一个简单案例。

1.创建数据实体

namespace WpfApp_converter.Model
{
    /// <summary>
    /// 作者:wangj
    /// 时间:2020-07-05 15:23:36
    /// 描述:数据实体
    /// </summary>
    public class DataEntity
    {
        public int id { get; set; }
        public bool useFlag { get; set; }
        public string deviceName { get; set; }
    }
}

2.定义转换器

using System;
using System.Windows.Data;
using System.Windows.Markup;

namespace WpfApp_converter.Converter
{
    /// <summary>
    /// 作者:wangj
    /// 时间:2020-07-05 15:21:42
    /// 描述:
    /// </summary>
    public class BoolToStrConverter : MarkupExtension, IValueConverter
    {
        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            return this;
        }

        /// <summary>
        /// 源 --- 》 转换值
        /// </summary>
        /// <param name="value"></param>
        /// <param name="targetType"></param>
        /// <param name="parameter"></param>
        /// <param name="culture"></param>
        /// <returns></returns>
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            object obj = value;
            if (obj is bool)
            {
                bool path = (bool)obj;
                if (path == true)
                {
                    return "是";
                }
                else
                {
                    return "否";
                }
            }
            else
            {
                return "";
            }
        }


        /// <summary>
        /// 转换值  -----》  源
        /// </summary>
        /// <param name="value"></param>
        /// <param name="targetType"></param>
        /// <param name="parameter"></param>
        /// <param name="culture"></param>
        /// <returns></returns>
        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (targetType != typeof(Boolean))
            {
                return true;
            }
            else
            {
                if (value.ToString() == "是")
                {
                    return true;
                }
                else if (value.ToString() == "否")
                {
                    return false;
                }
                else  //错误输入的默认值
                {
                    value = "是";
                    return true;
                }
            }
        }
    }
}

3.在前端.xaml里使用

<Window x:Class="WpfApp_converter.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"
        mc:Ignorable="d"
        xmlns:my="clr-namespace:WpfApp_converter.Converter"
        Height="500" Width="1000"   WindowStartupLocation="CenterScreen" Title="设备状态维护">

    <Grid>
        <Grid.Resources>
            <my:BoolToStrConverter x:Key="BoolToStrConverter" />
        </Grid.Resources>
        <Border    BorderBrush="Black" BorderThickness="1">
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="200*"></RowDefinition>
                    <RowDefinition Height="70"></RowDefinition>
                </Grid.RowDefinitions>

                <DataGrid Grid.Row="0"  CanUserAddRows="False"  AutoGenerateColumns="False"     Margin="0"
                           SelectionMode="Single" SelectionUnit="FullRow"    EnableRowVirtualization="False"
                                  FontSize="15"
                      Name="dataGrid1"   RowHeaderWidth="0" Background="{x:Null}" BorderBrush="LightGray" RowHeight="31">

                    <DataGrid.Columns>
                        <DataGridTextColumn   Header="编号"      Binding="{Binding id}" Width="70*" />

                        <DataGridTextColumn   Header="设备名称"      Binding="{Binding deviceName}" Width="70*" />

                        <DataGridTextColumn  Header="是否启用"
                                         Binding="{Binding Path= useFlag, Converter={StaticResource BoolToStrConverter}}" Width="110*" />
                    </DataGrid.Columns>
                </DataGrid>

                <Grid Grid.Row="1">
                    <Button Content="获取数据状态"  VerticalAlignment="Center" HorizontalAlignment="Center" Margin="0"  Width="162" Height="26" Click="Button_Click" />
                </Grid>
            </Grid>
        </Border>
    </Grid>
</Window>

4.后端xaml.cs文件里赋值和调用

赋值:


using System;
using System.Collections.Generic;
using System.Windows;
using WpfApp_converter.Model;

namespace WpfApp_converter
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        /// <summary>
        /// 数据实体list
        /// </summary>
        private List<DataEntity> globalEntityList = new List<DataEntity>();

        public MainWindow()
        {
            InitializeComponent();

            loadDataToGrid();
        }

        /// <summary>
        /// 将数据加载到表格显示
        /// </summary>
        private void loadDataToGrid()
        {
            for (int i = 0; i < 10; i++)
            {
                globalEntityList.Add(new DataEntity()
                {
                    id = i + 1,
                    deviceName = "检修设备" + (i + 1),
                    useFlag = i % 3 == 0 ? false : true,
                });
            }

            dataGrid1.ItemsSource = globalEntityList;
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            dataGrid1.ItemsSource = null;
            dataGrid1.ItemsSource = globalEntityList;

            globalEntityList.ForEach(t =>
            {
                Console.WriteLine("\n" + t.deviceName + " " + t.useFlag);
            });
        }
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章