110,537
社区成员
发帖
与我相关
我的任务
分享
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using WindowsFormsApp4.Annotations;
namespace WindowsFormsApp4
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Vm vm=new Vm();
this.textBox1.DataBindings.Add(nameof(textBox1.Text), vm, nameof(vm.米));
this.textBox2.DataBindings.Add(nameof(textBox2.Text), vm, nameof(vm.厘米));
this.textBox3.DataBindings.Add(nameof(textBox3.Text), vm, nameof(vm.毫米));
}
}
public class Vm:INotifyPropertyChanged
{
//如果我已厘米为基准
private double _厘米=0;
private double _毫米=0;
private double _米=0;
public double 厘米
{
get => _厘米;
set
{
if (value.Equals(_厘米)) return;
_厘米 = value;
OnPropertyChanged();
}
}
public double 毫米
{
get => _毫米;
set
{
if (value.Equals(_毫米)) return;
_毫米 = value;
this.厘米 = _毫米 / 10;
}
}
public double 米
{
get => _米;
set
{
if (value.Equals(_米)) return;
_米 = value;
this.厘米 = this._米 * 100;
}
}
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
//既然任何转换都会触发厘米,而厘米变化都会触发到此处,在此处重新整体计算
this._毫米 = this.厘米 * 10;
this._米 = this.厘米 / 100;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//双向绑定
LengthConvert lengthConversion = new LengthConvert();
Binding binding = new Binding("Text", lengthConversion, "M");
binding.Format += Binding_Format;
binding.Parse += Binding_Parse;
binding.DataSourceUpdateMode = DataSourceUpdateMode.OnPropertyChanged;
txtM.DataBindings.Add(binding);
binding = new Binding("Text", lengthConversion, "Dm");
binding.Format += Binding_Format;
binding.Parse += Binding_Parse;
binding.DataSourceUpdateMode = DataSourceUpdateMode.OnPropertyChanged;
txtDm.DataBindings.Add(binding);
binding = new Binding("Text", lengthConversion, "Cm");
binding.Format += Binding_Format;
binding.Parse += Binding_Parse;
binding.DataSourceUpdateMode = DataSourceUpdateMode.OnPropertyChanged;
txtCm.DataBindings.Add(binding);
binding = new Binding("Text", lengthConversion, "Mm");
binding.Format += Binding_Format;
binding.Parse += Binding_Parse;
binding.DataSourceUpdateMode = DataSourceUpdateMode.OnPropertyChanged;
txtMm.DataBindings.Add(binding);
}
// Data -> UI
// Format 事件:当数据被绑定到控件的时候触发。就是在数据要显示到控件中的时候。
private void Binding_Format(object sender, ConvertEventArgs e)
{
if (Convert.ToDouble(e.Value) == 0)
{
e.Value = "";
}
}
// UI -> Data
//Parse 事件:当控件的属性发生改变而导致要更新数据源的时候触发。
private void Binding_Parse(object sender, ConvertEventArgs e)
{
if (e.Value.ToString().Trim() == "")
{
e.Value = 0;
}
}
}
class LengthConvert
{
private double mm = 0;
public double Mm
{
get { return Convert.ToDouble(mm); }
set { mm = value; }
}
public double M
{
get { return Convert.ToDouble(mm) / 1000; }
set { mm = value * 1000; }
}
public double Dm
{
get { return Convert.ToDouble(mm) / 100; }
set { mm = value * 100; }
}
public double Cm
{
get { return Convert.ToDouble(mm) / 10; }
set { mm = value * 10; }
}
}