WPF将文本框绑定到ViewModel

时间:2011-03-17 14:11:57

标签: c# .net wpf data-binding mvvm

我有一个文本框绑定到我的ViewModel上名为DatabaseFilter

的属性

这是属性的实现

public string DatabaseFilter {
    get { return _databaseFilter; }
    set { 
        _databaseFilter = value;
        FilterDatabases();
    }
}

正如您所看到的,我正在尝试根据文本框中输入的内容触发过滤。

问题是,当文本框失去焦点时会触发setter。因此,在用户按下TAB之前,键入文本框不会执行任何操作。

是否可以通过绑定每次按键进行视图模型下的绑定更新?我想避免添加键向下/向上事件,以保持UI /代码尽可能干净。

6 个答案:

答案 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();
        }
    }
}