使用 MVVM Light 绑定两个文本框
Binding two textBoxes using MVVM Light
我有两个并排的文本框,InputInches
和 InputMillimeters
我想做的是英寸到毫米的转换,类似于 Goolge 转换的工作方式。我想要发生的是,当用户开始在第一个文本框 InputInches
中输入时,结果将显示在第二个文本框 (InputMillimeters) 中,反之亦然,如果用户开始在第二个文本框中输入结果将显示在第一个文本框中。
下面的代码可以很好地按照我的意愿进行英寸到毫米的转换,但是如果我取消注释 convertMillimetersToInches()
方法中的代码,我会收到错误消息。
关于如何使用 MVVM Light 进行这种类型的绑定有什么建议吗?
UI:
XAML:
<TextBox x:Name="textBox1"
Text="{Binding InputInches,UpdateSourceTrigger=PropertyChanged}"/>
<TextBox x:Name="textBox2"
Text="{Binding InputMillimeters,UpdateSourceTrigger=PropertyChanged}"/>
ViewModel:
namespace MyApp.ViewModel
{
public class ConversionViewModel : ViewModelBase
{
private string _inputInches;
private string _inputInchesTrimmed;
private string _inputMillimeters;
private string _inputMillimetersTrimmed;
public ConversionViewModel()
{
}
public string InputInches
{
get { return _inputInches; }
set {
_inputInches = value;
_inputInchesTrimmed = value.Trim();
RaisePropertyChanged();
if (_inputInchesTrimmed == "") {
_inputInchesTrimmed = "0";
}
convertInchesToMillimeters();
}
}
public string InputMillimeters
{
get { return _inputMillimeters; }
set {
_inputMillimeters = value;
_inputMillimetersTrimmed = value.Trim();
RaisePropertyChanged();
if (_inputMillimetersTrimmed == "") {
_inputMillimetersTrimmed = "0";
}
convertMillimetersToInches();
}
}
/// CONVERSION METHODS
private void convertInchesToMillimeters()
{
double millimeters = Convert.ToDouble(_inputInchesTrimmed) * 25.4;
InputMillimeters = Convert.ToString(millimeters);
}
private void convertMillimetersToInches()
{
//double inches = Convert.ToDouble(_inputInchesTrimmed) / 25.4;
//InputInches = Convert.ToString(inches);
}
}
}
错误信息:
Make sure you don't have an infinite loop or inifinite recursion
简单回答:
检查你的方法设置值之前的相等性(其他方法重复):
private void convertInchesToMillimeters()
{
string millimeters = (Convert.ToDouble(_inputInchesTrimmed) * 25.4).ToString();
if(millimeters != InputMillimeters) InputMillimeters = millimeters;
}
更复杂的答案。只使用一个 属性 并实现两个 wpf 转换器(参见 https://www.wpf-tutorial.com/data-binding/value-conversion-with-ivalueconverter/)
我有两个并排的文本框,InputInches
和 InputMillimeters
我想做的是英寸到毫米的转换,类似于 Goolge 转换的工作方式。我想要发生的是,当用户开始在第一个文本框 InputInches
中输入时,结果将显示在第二个文本框 (InputMillimeters) 中,反之亦然,如果用户开始在第二个文本框中输入结果将显示在第一个文本框中。
下面的代码可以很好地按照我的意愿进行英寸到毫米的转换,但是如果我取消注释 convertMillimetersToInches()
方法中的代码,我会收到错误消息。
关于如何使用 MVVM Light 进行这种类型的绑定有什么建议吗?
UI:
XAML:
<TextBox x:Name="textBox1"
Text="{Binding InputInches,UpdateSourceTrigger=PropertyChanged}"/>
<TextBox x:Name="textBox2"
Text="{Binding InputMillimeters,UpdateSourceTrigger=PropertyChanged}"/>
ViewModel:
namespace MyApp.ViewModel
{
public class ConversionViewModel : ViewModelBase
{
private string _inputInches;
private string _inputInchesTrimmed;
private string _inputMillimeters;
private string _inputMillimetersTrimmed;
public ConversionViewModel()
{
}
public string InputInches
{
get { return _inputInches; }
set {
_inputInches = value;
_inputInchesTrimmed = value.Trim();
RaisePropertyChanged();
if (_inputInchesTrimmed == "") {
_inputInchesTrimmed = "0";
}
convertInchesToMillimeters();
}
}
public string InputMillimeters
{
get { return _inputMillimeters; }
set {
_inputMillimeters = value;
_inputMillimetersTrimmed = value.Trim();
RaisePropertyChanged();
if (_inputMillimetersTrimmed == "") {
_inputMillimetersTrimmed = "0";
}
convertMillimetersToInches();
}
}
/// CONVERSION METHODS
private void convertInchesToMillimeters()
{
double millimeters = Convert.ToDouble(_inputInchesTrimmed) * 25.4;
InputMillimeters = Convert.ToString(millimeters);
}
private void convertMillimetersToInches()
{
//double inches = Convert.ToDouble(_inputInchesTrimmed) / 25.4;
//InputInches = Convert.ToString(inches);
}
}
}
错误信息:
Make sure you don't have an infinite loop or inifinite recursion
简单回答: 检查你的方法设置值之前的相等性(其他方法重复):
private void convertInchesToMillimeters()
{
string millimeters = (Convert.ToDouble(_inputInchesTrimmed) * 25.4).ToString();
if(millimeters != InputMillimeters) InputMillimeters = millimeters;
}
更复杂的答案。只使用一个 属性 并实现两个 wpf 转换器(参见 https://www.wpf-tutorial.com/data-binding/value-conversion-with-ivalueconverter/)