【问题标题】:WPF Binding Textbox to ViewModelWPF 将文本框绑定到 ViewModel
【发布时间】:2011-07-17 10:43:58
【问题描述】:

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

这里是属性的实现

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

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

问题是,当文本框失去焦点时会触发 setter。因此,在用户按下 TAB 之前,输入文本框不会做任何事情。

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

【问题讨论】:

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


    【解决方案1】:

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

    或者干脆把你的代码改成这样:

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

    【讨论】:

    • 谢谢,虽然更改属性代码不会有太大作用,因为它只是在失去焦点之前不会被调用。创建命令会起作用,但就我而言,我更喜欢不需要命令的更简单的解决方案,只需简单的绑定即可。同意上述更改 UpdateSourceTrigger 属性的建议,这正是我所需要的。
    【解决方案2】:

    将 TextBox 上的 UpdateSourceTrigger 设置为 PropertyChanged(默认为 LostFocus

    【讨论】:

    • 致所有对完全有效答案投反对票的人:如果您不能自己做,请至少粘贴评论以说明您希望改进的内容
    【解决方案3】:

    UpdateSourceTrigger=PropertyChanged 应该会为你解决这个问题

    【讨论】:

      【解决方案4】:

      更改您的绑定以在属性更改时更新源:

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

          您需要在绑定表达式上设置UpdateSourceTrigger=PropertyChanged 属性,例如

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

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-07-04
            • 2016-02-12
            • 1970-01-01
            • 1970-01-01
            • 2012-05-09
            • 1970-01-01
            • 1970-01-01
            • 2012-02-23
            相关资源
            最近更新 更多