从Viewmodel更改的文本框值未在UI上反映

时间:2017-03-08 18:42:05

标签: wpf mvvm dependency-properties

我有一个文本框,文本绑定到ViewModel中的属性。用户可以手动输入文本或从剪贴板粘贴。 我解析用户输入的文本(我使用 UpdateSourceTrigger = PropertyChanged )并按换行符分隔文本。

问题:当用户点击进入时,一切正常。但是当我尝试处理粘贴的文本时,只要我第一次看到" \ n",我会尝试将其分解为不同的字符串并清除文本框。在ViewModel中,文本设置为string.empty,但它不会反映在UI上。

代码有什么问题?我知道在自己的setter属性中编辑文本不是很好的编码实践,但我怎么能这样做呢?

以下是代码段:

XAML

    <TextBox AcceptsReturn="True" VerticalAlignment="Stretch" BorderBrush="Transparent"
             Text="{Binding TextBoxData, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}">
        <TextBox.InputBindings>
            <KeyBinding Key="Enter" Command="{Binding OnNewLineCommand}"/>
        </TextBox.InputBindings>
    </TextBox>

视图模型:

     public string TextBoxData
        {
            get
            {
                return _textBoxData;
            }
            set
            {
                _textBoxData = value;
                RaisePropertyChanged("TextBoxData");
                if(_textBoxData != null && _textBoxData.Contains("\n"))
                {
                    OnNewLineCommandEvent(null);
                }
            }
        }

    public DelegateCommand<string> OnNewLineCommand
    {
        get
        {
            if (_onNewLineCommand == null)
            {
                _onNewLineCommand = new DelegateCommand<string>(OnNewLineCommandEvent);
            }
            return _onNewLineCommand;
        }
    }

    private void OnNewLineCommandEvent(string obj)
    {
        if (_textBoxData != null && _textBoxData.Length > 0)
        {
            List<string> tbVals = _textBoxData.Split('\n').ToList();
            foreach (string str in tbVals)
            {
                ListBoxItems.Add(new UnitData(str.Trim()));
            }
            TextBoxData = string.Empty;
        }
    }

谢谢,

RDV

1 个答案:

答案 0 :(得分:0)

我想出了这个问题。如果我尝试在其setter中修改文本框值并且未更改值,则不会在UI上反映出来。下面可能有助于更好地解释这一点:

  1. 最初,当UI启动时,VM中的文本框值设置为“ABC”。
  2. 用户从UI将此值更改为“XYZ”。
  3. 在VM setter中,程序员检查文本框值是否为“XYZ”,然后将其更改回“ABC” - &gt;这种情况在我的情况下失败了。 VM中文本框的值已更改为“ABC”,但UI仍将显示“XYZ”。
  4. 解决方案:在VM中,不是将值设置回“ABC”,而是将其设置为“ABC”(注意附加空格) - &gt;这将改变UI值。

    更新的虚拟机代码:

            private bool _isTextValChanged = false;
        private void OnNewLineCommandEvent(string obj)
        {
            if (_textBoxData != null && _textBoxData.Length > 0)
            {
                List<string> tbVals = _textBoxData.Split('\n').ToList();
                foreach (string str in tbVals)
                {
                    ListBoxItems.Add(new UnitData(str.Trim()));
                }
                //This will toggle textbox value and updated value will be reflected on the UI.
                if (_isTextValChanged)
                    TextBoxData = " ";
                else
                    TextBoxData = string.Empty;
    
                _isTextValChanged = !_isTextValChanged;
            }
        }
    

    谢谢,

    RDV