从 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 中。下面可能有助于更好地解释这一点:
- 最初,当 UI 启动时,VM 中的文本框值设置为 "ABC"。
- 用户将此值从 UI 更改为 "XYZ"。
- 在 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
我有一个文本框,文本绑定到 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 中。下面可能有助于更好地解释这一点:
- 最初,当 UI 启动时,VM 中的文本框值设置为 "ABC"。
- 用户将此值从 UI 更改为 "XYZ"。
- 在 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