MVVM聚焦要将文本框

问题描述 投票:9回答:6

我将如何设置聚焦到TextBox不为TextBox指定名称?目前,我做以下

<Window FocusManager.FocusedElement="{Binding ElementName=Username}">
    <Grid>
        <TextBox Text="{Binding Username}" Name="Username" />            
    </Grid>
</Window>

是否有这样做而没有指定名称为TextBox的任何方式。正如我相信有一个名称元素MVVM通常意味着糟糕的设计?

wpf mvvm textbox
6个回答
3
投票

我已经证明了“纯MVVM”的方式在我的回答a similar problem做到这一点。该解决方案包括使用附加属性,并从视图模型传递接口命令回观的框架。


22
投票

正如我相信有一个名称元素MVVM通常意味着糟糕的设计?

不,这不对。

MVVM模式是不是消除代码隐藏文件中的所有代码。

它是关于关注分离和提高可测试性。像处理焦点查看相关的代码应保留在视图中的代码隐藏文件。但它是坏的,看看在查看的代码隐藏文件,应用逻辑或数据库连接管理。

在代码隐藏文件中的代码MVVM例子在不违反MVVM模式可以在WPF Application Framework (WAF)项目中找到。


6
投票

最简单的方法是将焦点设置在用户控件Load事件

        this.txtBox.Focus();
        txtBox.Focusable = true;
        Keyboard.Focus(txtBox);

MVVM并不意味着你不能把代码隐藏文件中的代码。其实,不要让任何模式限制你找到编码的最佳方式。


3
投票

后面的代码应在可能的情况,当它更是在视图中避免。我有同样的问题,并进行简单的目的,最好的答案是这样的一个,因为它只是修改了看法:

WPF MVVM Default Focus on Textbox and selectAll

如果您正在寻找重新设置焦点,你与其他用户控件元素进行交互,这将这样的伎俩:

Set focus on textbox in WPF from view model (C#)

我失去了3天搞清楚了这一点,我希望这可以帮助。


0
投票

正如我相信有一个名称元素MVVM通常意味着糟糕的设计?

不,这不对。

据微软MVP的不仅是命名控制WPF是不好的做法,是对性能有相当大的打击。只是想沿着一些智慧的话传

我与肖恩·杜同意关于不让任何模式完全限制你,我觉得应该尽量避免性能下降。


0
投票

其实,我发现布尔附加属性的解决方案有点脏,笨拙的,你必须找到一个扭曲,以确保下一组您的视图模型属性将真正提高附加属性更改事件的方式。

一个简单,更优雅的解决方案是在绑定属性类型的行为,你可以肯定的是,下一个值将始终从以前的一个是不同的,因此要确保你的附加属性更改事件会在每次倍提高。

该进入脑海的最简单的类型是int类型。然后将溶液的通常的组合:

行为:

public static class TextBoxFocusBehavior
{
    public static int GetKeepFocus(DependencyObject obj)
    {
        return (int)obj.GetValue(KeepFocusProperty);
    }

    public static void SetKeepFocus(DependencyObject obj, int value)
    {
        obj.SetValue(KeepFocusProperty, value);
    }

    // Using a DependencyProperty as the backing store for KeepFocus.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty KeepFocusProperty =
        DependencyProperty.RegisterAttached("KeepFocus", typeof(int), typeof(TextBoxFocusBehavior), new UIPropertyMetadata(0, OnKeepFocusChanged));

    private static void OnKeepFocusChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        TextBox t = d as TextBox;
        if (t != null)
        {
            t.Focus();
        }
    }
}

视图模型属性:

    public int InputFocus
    {
        get { return _inputFocus; }
        private set
        {
            _inputFocus = value;
            Notify(Npcea.InputFocus);
        }
    }

使用附加的行为:

 <TextBox  v:TextBoxFocusBehavior.KeepFocus="{Binding InputFocus}"/>

最后使用VM中的属性:

    public void YouMethod()
    {
        //some code logic
        InputFocus++;//<= the textbox focus
    }

一些非常糟糕的头脑精神可以说,这种逻辑被绑定到INT32大小限制。嗯......我会只选对的,现在忽略他们;-)

© www.soinside.com 2019 - 2024. All rights reserved.