WPF绑定文本框视图模型

问题描述:

我有一个绑定到名为DatabaseFilterWPF绑定文本框视图模型

这里对我的ViewModel属性的文本框是属性

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

,你可以看到,我试图实施根据输入到文本框中的内容触发一个过滤。

问题是,setter在文本框失去焦点时被触发。因此,直到用户按TAB,才能在文本框中输入内容。

是否有可能使绑定更新下属viewmodel与每个按键通过绑定?我想避免不得不添加按键向下/向上事件,以尽可能保持UI /代码隐藏。

你的文本框设置UpdateSourceTriggerPropertyChanged(默认为LostFocus

+0

就是这样,谢谢! – 2011-03-17 14:20:21

+0

高兴地帮助:) – Maverik 2011-03-17 14:21:10

+1

向所有人投下一个完全有效的答案:有礼貌至少贴个评论来说出你想看到改进的东西,如果你自己做不到的话 – Maverik 2014-05-23 12:55:26

在虚拟机“FilterDatabaseCommand”中创建一个命令,将文本框的事件“TextChanged”绑定到该命令(使用EventToCommand行为)。

或者简单地改变你的代码如下:

public string DatabaseFilter { 
    get { return _databaseFilter; } 
    set { 
     if(_databaseFilter != value) { 
      _databaseFilter = value; 
      FilterDatabases(); 
     } 
    } 
} 
+0

不知道你的代码示例如何解决他的问题。 – Mikeb 2011-03-17 14:19:11

+0

谢谢,虽然改变属性代码不会有太大的作用,因为它只是在失去焦点之前才被调用。创建命令将工作,但在我的情况下,我更喜欢简单的解决方案,不需要命令,只需简单的绑定。与上面的建议更改UpdateSourceTrigger属性,并做了我所需要的。 – 2011-03-17 14:23:07

UpdateSourceTrigger=PropertyChanged要解决这个问题,你

+0

就是这样,谢谢! – 2011-03-17 14:20:05

更改绑定每当属性发生变化时更新源代码:

<TextBox Text="{Binding DatabaseFilter, UpdateSourceTrigger=PropertyChanged}">

在绑定上使用Binding.UpdateSourceTrigger属性。默认的更新源触发器是焦点丢失。您可以更改它,以便每次文本框中的文本发生更改时都会发生绑定。

看到http://msdn.microsoft.com/en-us/library/system.windows.data.binding.updatesourcetrigger.aspx

你需要设置你的绑定表达式,如UpdateSourceTrigger=PropertyChanged财产

<TextBox Text="{Binding Path=DatabaseFilter, UpdateSourceTrigger=PropertyChanged}" /> 

也有可用的不同的值,如:Explicit - 当你需要显式调用绑定更新; LostFocus - 这是TextBox的默认值,在控件失去焦点后更新绑定。

您需要记住,如果您的过滤操作在UI线程上执行,则在每次击键后进行过滤可能不是最明智的做法,因为用户体验可能会受到此过滤所产生的延迟的严重影响。如果您肯定,每次击键都需要过滤,确保过滤快速(例如,只有少数项目要过滤),或者您将在后台线程中过滤。