近期在项目希望实现 编辑值与原始数据的 双向转换。 经过调试,这才发现Converter自带该功能。 以下是一个简单案例。
1.创建数据实体
namespace WpfApp_converter.Model
{
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
{
public class BoolToStrConverter : MarkupExtension, IValueConverter
{
public override object ProvideValue(IServiceProvider serviceProvider)
{
return this;
}
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 "";
}
}
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
{
public partial class MainWindow : Window
{
private List<DataEntity> globalEntityList = new List<DataEntity>();
public MainWindow()
{
InitializeComponent();
loadDataToGrid();
}
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);
});
}
}
}