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

Textbox value changed from Viewmodel not reflected on UI

我有一个文本框,文本绑定到 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

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

  1. 最初,当 UI 启动时,VM 中的文本框值设置为 "ABC"。
  2. 用户将此值从 UI 更改为 "XYZ"。
  3. 在 VM setter 中,程序员检查文本框值是否为 "XYZ",然后将其改回 "ABC" --> 这在我的案例中失败了。 VM 中文本框的值已更改为 "ABC" 但 UI 仍会显示 "XYZ".

解决方案:在 VM 中,不要将值设置回 "ABC",而是将其设置为 "ABC "(注意附加的 space)-> 这将更改 UI值。

更新的 VM 代码:

        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