使用MVVM Light绑定两个文本框

时间:2018-08-12 13:14:47

标签: c# wpf xaml mvvm-light

我有两个并排的文本框,InputInchesInputMillimeters,我想做的是英寸到毫米的转换,类似于Goolge转换的工作方式。我想发生的是,当用户开始在第一个文本框InputInches中键入内容时,如果用户开始在第二个文本框中输入内容,结果将显示在第二个文本框中(InputMillimeters),反之亦然结果将显示在第一个文本框中。

以下代码完全可以按我的要求很好地进行英寸到毫米的转换,但是如果我取消注释convertMillimetersToInches()方法中的代码,则会出现错误。

关于如何使用MVVM Light进行这种类型的绑定的任何建议?

用户界面: enter image description here

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);
        }
    }
}

错误消息:

  

确保您没有无限循环或无限递归

1 个答案:

答案 0 :(得分:2)

简单答案: 检查您的方法是否等于设置值(与其他方法重复):

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/