在两个文本框中使用 SelectionChanged 事件,一个依赖于另一个
Use SelectionChanged event in two textbox , one depend from the other
我有两个文本框,我正在尝试向两个文本框添加 SelectionChanged
事件 :
TextBox A => Amount
TextBox B => Summary
场景是这样的:
两个文本框为空:
用户输入汇总金额将等于100 * Amount
用户在清除金额字段后输入摘要,他应该在金额文本框中得到summary / 100
private void Amount_SelectionChanged(object sender, RoutedEventArgs e)
{
if (!string.IsNullOrEmpty(Amount.Text.ToString()))
{
Summary.IsReadOnly = true;
Summary.Text = (ToDecimalValue(Amount.Text) * 100).ToString();
Amount.IsReadOnly = false;
}
else
{
Summary.Text = "";
Summary.IsReadOnly = false;
}
}
private void Summary_SelectionChanged(object sender, RoutedEventArgs e)
{
if (!string.IsNullOrEmpty(Summary.Text.ToString()))
{
Amount.IsReadOnly = true;
Amount.Text = (ToDecimalValue(Summary.Text) / 100).ToString()
Summary.IsReadOnly = false;
}
else
{
Summary.Text = "";
Summary.IsReadOnly = false;
}
}
我该怎么做?
我相信有一个简单的解决方案:
private bool _isEditing;
private void Amount_TextChanged(object _, RoutedEventArgs __)
{
if (_isEditing)
return;
_isEditing = true;
if (double.TryParse(Amount.Text, out double amount)
Summary.Text = (amount * 100).ToString();
else
Summary.Clear();
_isEditing = false;
}
private void Summary_TextChanged(object _, RoutedEventArgs __)
{
if (_isEditing)
return;
_isEditing = true;
if (double.TryParse(Summary.Text, out double summary)
Amount.Text = (summary / 100).ToString();
else
Amount.Clear();
_isEditing = false;
}
备注:
- 我将“SelectionChanged”更改为“TextChanged”,因为如果用户更改了 TextBox 中的值,这是您要观看的事件。
- 我用
double.TryParse()
替换了 ToDecimalValue()
,但这只有在小数点分隔符与应用程序的当前区域性相匹配时才有效。
_
和__
表示没有使用参数。
- 如果您希望 TextBox 仅接受数字,请参阅 this question。
我有两个文本框,我正在尝试向两个文本框添加 SelectionChanged
事件 :
TextBox A => Amount
TextBox B => Summary
场景是这样的:
两个文本框为空:
用户输入汇总金额将等于
100 * Amount
用户在清除金额字段后输入摘要,他应该在金额文本框中得到
summary / 100
private void Amount_SelectionChanged(object sender, RoutedEventArgs e) { if (!string.IsNullOrEmpty(Amount.Text.ToString())) { Summary.IsReadOnly = true; Summary.Text = (ToDecimalValue(Amount.Text) * 100).ToString(); Amount.IsReadOnly = false; } else { Summary.Text = ""; Summary.IsReadOnly = false; } } private void Summary_SelectionChanged(object sender, RoutedEventArgs e) { if (!string.IsNullOrEmpty(Summary.Text.ToString())) { Amount.IsReadOnly = true; Amount.Text = (ToDecimalValue(Summary.Text) / 100).ToString() Summary.IsReadOnly = false; } else { Summary.Text = ""; Summary.IsReadOnly = false; } }
我该怎么做?
我相信有一个简单的解决方案:
private bool _isEditing;
private void Amount_TextChanged(object _, RoutedEventArgs __)
{
if (_isEditing)
return;
_isEditing = true;
if (double.TryParse(Amount.Text, out double amount)
Summary.Text = (amount * 100).ToString();
else
Summary.Clear();
_isEditing = false;
}
private void Summary_TextChanged(object _, RoutedEventArgs __)
{
if (_isEditing)
return;
_isEditing = true;
if (double.TryParse(Summary.Text, out double summary)
Amount.Text = (summary / 100).ToString();
else
Amount.Clear();
_isEditing = false;
}
备注:
- 我将“SelectionChanged”更改为“TextChanged”,因为如果用户更改了 TextBox 中的值,这是您要观看的事件。
- 我用
double.TryParse()
替换了ToDecimalValue()
,但这只有在小数点分隔符与应用程序的当前区域性相匹配时才有效。 _
和__
表示没有使用参数。- 如果您希望 TextBox 仅接受数字,请参阅 this question。