我正在使用各种弹出查找等开发复杂的数据输入表单。由于不同的事情 - 某些控件的焦点会丢失,我需要一些方法来设置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;
答案 0 :(得分:1)
它有味道,但我认为我们无能为力
通常我会对AttachedProperty
做同样的事情,并在IsFocused
中的某处保留一个View
bool(因为这是一个特定于视图的问题,不应该与业务逻辑混合在一起)。然后,我会让View
听取某些事件系统,例如(PRISM的EventAggregator
或MVVM Light Messenger
)用于ResetFocus
事件,我会提高ResetFocus
事件,只要某些内容导致焦点在我的窗口/页面之间或对话框之后发生变化。
它不漂亮,但它有效。