如何在Silverlight中设置焦点
问题描述:
我有一个带有多个文本框的用户控件的Silverlight应用程序。我正在使用MVVM模式。如何在Silverlight中设置焦点
当我点击添加按钮时,ViewModel执行一些逻辑。在添加命令逻辑完成后,我想在每次单击后将SetFocus设置为txtName文本框。
我该怎么用Silverlight UserControl和MVVM做到这一点?
答
当然没有“IsFocused”属性,但也有至少两个MVVM友好的方式,你可以使用:
- 使用触发器/动作组在混合SDK扩展。具体来说,在按钮的“单击”事件上使用
EventTrigger
,然后使用CallMethodAction
在目标元素上调用“SetFocus”。 - 使用
Behavior
以及附加属性在目标上调用“焦点”。
对于第一个,你只需要像这样:
<Button Content="Add"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<i:InvokeCommandAction Command="{Binding AddCommand}" />
<ei:CallMethodAction TargetObject="{Binding ElementName=NameOfElementToFocus}"
MethodName="Focus" />
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
<TextBox x:Name="NameOfElementToFocus" />
(或者,而不是使用CallMethodAction
,你也可以使用一个简单的"focus"动作。)
我不会发布第二种方法的任何代码 - 这是一个常见的用例,您将能够找到ex通过搜索找到(for example)。基本思想是创建一个Behavior
类,并在其“change”处理程序中添加布尔附加属性“IsFocused”,然后在AttachedObject上调用“Focus”。然后您可以将属性MVVM式绑定到一个属性在您的视图模型,这样的事情:
<TextBox x:Name="NameOfElementToFocus" my:FocusBehavior.IsFocused="{Binding IsTextBoxFocused}" />
哦McGarnagle,有一天,我一定给你买啤酒先生,我从来没有想过,简单callmethodaction路线,干杯。 – 2014-10-21 19:33:53