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);
            });
        }
    }
}

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