我有一个文本框绑定到我的ViewModel上名为DatabaseFilter
的属性这是属性的实现
public string DatabaseFilter {
get { return _databaseFilter; }
set {
_databaseFilter = value;
FilterDatabases();
}
}
正如您所看到的,我正在尝试根据文本框中输入的内容触发过滤。
问题是,当文本框失去焦点时会触发setter。因此,在用户按下TAB之前,键入文本框不会执行任何操作。
是否可以通过绑定每次按键进行视图模型下的绑定更新?我想避免添加键向下/向上事件,以保持UI /代码尽可能干净。
答案 0 :(得分:43)
将TextBox上的UpdateSourceTrigger
设置为PropertyChanged
(默认为LostFocus
)
答案 1 :(得分:23)
您需要在绑定表达式上设置UpdateSourceTrigger=PropertyChanged
属性,例如
<TextBox Text="{Binding Path=DatabaseFilter, UpdateSourceTrigger=PropertyChanged}" />
还有不同的值,例如:Explicit
- 当您需要显式调用绑定更新时; LostFocus
- 这是TextBox
的默认值,在控件失去焦点后更新绑定。
您需要记住,如果您的过滤操作在UI线程上执行,则每次击键后进行过滤可能不是最明智的事情,因为此过滤产生的延迟可能会严重影响用户体验。如果你是肯定的,你需要在每次击键后进行过滤,请确保过滤速度很快(例如只有几个要过滤的项目),或者你将在后台线程中过滤。
答案 2 :(得分:5)
更改绑定以在属性更改时更新源:
<TextBox Text="{Binding DatabaseFilter, UpdateSourceTrigger=PropertyChanged}">
答案 3 :(得分:3)
UpdateSourceTrigger=PropertyChanged
应该为您解决此问题
答案 4 :(得分:3)
在绑定上使用Binding.UpdateSourceTrigger
属性。默认更新源触发器是焦点丢失。您可以对其进行更改,以便每次文本框中的文本发生更改时都会发生绑定。
请参阅http://msdn.microsoft.com/en-us/library/system.windows.data.binding.updatesourcetrigger.aspx
答案 5 :(得分:0)
在VM“FilterDatabaseCommand”中创建一个命令,将文本框的事件“TextChanged”绑定到此命令(使用EventToCommand行为)。
或者只是将您的代码更改为:
public string DatabaseFilter {
get { return _databaseFilter; }
set {
if(_databaseFilter != value) {
_databaseFilter = value;
FilterDatabases();
}
}
}