2014-10-20 121 views
0

我有一個帶有多個文本框的用戶控件的Silverlight應用程序。我正在使用MVVM模式。如何在Silverlight中設置焦點

當我點擊添加按鈕時,ViewModel執行一些邏輯。在添加命令邏輯完成後,我想在每次單擊後將SetFocus設置爲txtName文本框。

我該怎麼用Silverlight UserControl和MVVM做到這一點?

回答

2

當然沒有「IsFocused」屬性,但也有至少兩個MVVM友好的方式,你可以使用:

  1. 使用觸發器/動作組在混合SDK擴展。具體來說,在按鈕的「單擊」事件上使用EventTrigger,然後使用CallMethodAction在目標元素上調用「SetFocus」。
  2. 使用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}" /> 
+0

哦McGarnagle,有一天,我一定給你買啤酒先生,我從來沒有想過,簡單callmethodaction路線,乾杯。 – 2014-10-21 19:33:53