使用 MVVM Light 绑定两个文本框

Binding two textBoxes using MVVM Light

我有两个并排的文本框,InputInchesInputMillimeters 我想做的是英寸到毫米的转换,类似于 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/