2017-03-08 37 views
1

我有一個文本框,文本綁定到ViewModel中的屬性。用戶可以手動輸入文本或從剪貼板粘貼。 我解析了用戶輸入的文本(我使用UpdateSourceTrigger = PropertyChanged),並通過換行符char分隔文本。文本框值從Viewmodel更改不反映在UI

問題:當用戶點擊輸入時,一切工作正常。但是,當我嘗試處理粘貼的文本時,只要我首先看到「\ 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

+0

請問您的ViewModel執行INotifyPropertyChanged? – Dmihawk

+1

您是否嘗試在setter中的OnNewLineCommandEvent之後調用RaisePropertyChanged? –

+1

是的,我的VM實現INotifyPropertyChanged-它被稱爲RaisePropertyChanged。是的,我在OnNewLineCommandEvent之後嘗試調用RaisePropertyChanged,但它沒有幫助 – RDV

回答

0

我想通了這個問題。如果我嘗試修改其setter中的文本框值,並且值未更改,則不會在UI上反映出來。下面可能有助於更好地解釋這一點:

  1. 最初,當用戶界面啓動時,虛擬機中的文本框值被設置爲「ABC」。
  2. 用戶從UI中將此值更改爲「XYZ」。
  3. 在VM設置程序中,程序員檢查文本框值是否爲「XYZ」,然後將其更改回「ABC」 - >這在我的情況下失敗。虛擬機中的文本框的值已更改爲「ABC」,但UI仍會顯示「XYZ」。

解決方案:在VM中,不是將值設置回「ABC」,而是將其設置爲「ABC」(注意額外空間) - >這將更改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