【问题标题】:Caliburn Micro, set focus from MVCaliburn Micro,从 MV 设置焦点
【发布时间】:2013-12-21 06:24:09
【问题描述】:

如何将 UI 元素(如 textBox)焦点绑定到视图模型?

我有带有枢轴控制的 Windows Phone 应用程序。基于活动的数据透视项目,我想将焦点设置到某个文本框。此外,当用户将文本插入文本框并按 Enter 键时,我想将焦点设置在文本框以外的其他位置以关闭虚拟键盘。

如何使用 Caliburn Micro 执行此操作,查看模型?

【问题讨论】:

  • 这种类型的交互应该发生在视图中,而不是视图模型中,可能使用 System.Windows.Interactivity 定义的行为
  • 从视图中,我如何捕获用户点击输入的事件并将焦点设置在文本框以外的地方?根据我目前的设计,我需要从视图模型中处理这个问题。
  • 那么你应该改变你的设计。 ViewModel 无权访问事件,也不应该如此。它不应该用于 UI 交互。这就是 View 的工作。您甚至可以使用 System.Windows.Interactivity 行为、触发器和操作来处理纯 XAML 中的事件。
  • 有什么例子或教程吗? :)

标签: wpf mvvm windows-phone-8 caliburn.micro


【解决方案1】:

我认为你不能通过 C.M. 做到这一点。我会写这样的行为:

public class BindableFocusBehavior : Behavior<Control>
{
    public static readonly DependencyProperty HasFocusProperty =
        DependencyProperty.Register("HasFocus", typeof(bool), typeof(BindableFocusBehavior), new PropertyMetadata(default(bool), HasFocusUpdated));

    private static void HasFocusUpdated(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        ((BindableFocusBehavior)d).SetFocus();
    }

    public bool HasFocus
    {
        get { return (bool)GetValue(HasFocusProperty); }
        set { SetValue(HasFocusProperty, value); }
    }

    private void SetFocus()
    {
        if (HasFocus)
        {
            AssociatedObject.Focus();
        }
    }
}

像这样使用它:

<TextBox>
    <i:Interaction.Behaviors>
        <wpfApplication2:BindableFocusBehavior HasFocus="{Binding SetFocus}"/>
    </i:Interaction.Behaviors>
</TextBox>

希望对你有帮助!

【讨论】:

  • 嗯,我收到错误:“'System.Windows.UIElement' 不包含'Focus' 的定义......”我错过了什么吗?
  • 您需要将 Behavior 更改为 Behavior 才能在 WP 上运行。
  • 我正在尝试将您的 BindableFocusBehavior 类插入到通用应用程序项目中,即使我插入了“使用 Microsoft.Xaml.Interactivity; 使用 Microsoft.Xaml.Interactions”,我也没有引用“行为”派生类。核;”。我缺少什么让它编译?谢谢
猜你喜欢
  • 2011-06-29
  • 2012-12-29
  • 1970-01-01
  • 2012-10-08
  • 1970-01-01
  • 1970-01-01
  • 2012-01-29
  • 2012-10-24
  • 2012-05-08
相关资源
最近更新 更多