【发布时间】:2013-06-20 11:20:52
【问题描述】:
所以我遇到了这个奇怪的问题。我有一个绑定到 ViewModel 的 TextBox :
<TextBox DockPanel.Dock="Right" Text="{Binding Path=FilterText, UpdateSourceTrigger=PropertyChanged}"/>
使用FilterText 的内容,我正在过滤ListBox(绑定到ObservableCollection)。
现在一切正常。但是每次击键后,这个TextBox的光标位置一直重置到开头。这只发生在这个特定的TextBox 上。我有其他绑定TextBox 工作得很好。
我用谷歌搜索,发现这发生在.NET4.0。但主要是在涉及字符串格式化或字符串到双重转换时。但是 FilterText 是简单的String 属性,并且任何地方都没有涉及double 变量。
代码如下:
private String _filterText;
public String FilterText
{
get { return _filterText; }
set
{
if (_filterText != value)
{
_filterText = value;
RaisePropertyChanged("FilterText");
FilterList(); //this method works fine
}
}
}
有人能解释一下为什么会这样吗?
在其他地方建议的解决方案包括将UpdateSourceTrigger 更改为LostFocus 或使用附加行为手动设置光标位置。还有其他更简单的解决方案吗?或者这只是一个错误?
【问题讨论】:
-
我猜如果您在
FilterText属性设置器中注释了对FilterList()的调用,问题不会发生? -
向我们展示 FilterList 代码,那里是导致问题的原因
-
@blindmeis,这里是代码。我还提供了方法中使用的 ObservableCollectionEx 的代码。 pastebin.com/1Q69LDRe
-
@AritraBhowmick 我可以重现像one you mentioned 这样的问题,但是你的对我来说效果很好。作为一个疯狂的猜测,在返回
_questions之前,尝试在FilterTextsetter 和Questions的属性getter 中用RaisePropertyChanged("Questions")替换对FilterList()的调用,然后添加FilterList()方法调用。逻辑应该与此相同,并且可以解决一些线程更新问题。 -
@Viv,按照你的建议做了。没有运气。插入符号位置未正确更新。我什至按照here 的建议添加了一个行为。但还是一样。
标签: wpf data-binding textbox cursor-position