Silverlight MVVM和处理FOCUS

时间:2011-10-05 02:08:00

标签: silverlight mvvm

我正在使用各种弹出查找等开发复杂的数据输入表单。由于不同的事情 - 某些控件的焦点会丢失,我需要一些方法来设置MVVM中的焦点。到目前为止,我想出了附加属性,我这样编码(实际依赖属性声明跳过):

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

所以,它非常简单。属性更改时 - 焦点设置。

我的观点:

<TextBox Text="{Binding CurrentItem.SerialNumber, Mode=TwoWay, NotifyOnValidationError=True}" 
                     behaviors:TextBoxBehaviors.IsFocused="{Binding SecondaryControlFocus}"
                     Grid.Column="1" Grid.Row="2" Margin="1" Grid.ColumnSpan="2" TabIndex="2" />

如你所见 - 我附加了这种行为并绑定到&#34; SecondaryControlFocus&#34;属性。

视图模型:

public bool SecondaryControlFocus
        {
            get
            {
                return this.secondaryControlFocus;
            }

            set
            {
                this.secondaryControlFocus = value;
                this.RaisePropertyChanged(() => this.SecondaryControlFocus);
            }
        }

并编码我如何设置焦点:

this.SecondaryControlFocus = !this.SecondaryControlFocus;

对我来说,此代码闻起来因为我必须切换属性强制并返回才能触发属性..

有没有更好的方法来完成我的工作?当高级用户无法使用TAB密钥时,没有什么比这更令人恼火了......我需要控制MVVM中的聚焦,这对于正确的数据输入流程很重要。但我希望代码有点“好”#34;

1 个答案:

答案 0 :(得分:1)

它有味道,但我认为我们无能为力

通常我会对AttachedProperty做同样的事情,并在IsFocused中的某处保留一个View bool(因为这是一个特定于视图的问题,不应该与业务逻辑混合在一起)。然后,我会让View听取某些事件系统,例如(PRISM的EventAggregator或MVVM Light Messenger)用于ResetFocus事件,我会提高ResetFocus事件,只要某些内容导致焦点在我的窗口/页面之间或对话框之后发生变化。

它不漂亮,但它有效。