Pedros の例と、以前アプリに実装した他のサービスを使用して、vb.net で次のソリューションをまとめました。
IFocus インターフェイスを作成します。このインターフェイスは、フォーカス サービスまたはモックによって実装できます。
Public Interface IFocusInterface
Sub Focus()
End Interface
IFocusable インターフェイスを作成します。これは ViewModel によって実装され、IFocusInterface を実装するオブジェクトを受け入れます。
Public Interface IFocusable
Property FocusService As IFocusInterface
End Interface
シングルトン パターンを使用してフォーカス インターフェイスを実装する
Imports Microsoft.Phone.Controls
Public NotInheritable Class FocusService
Implements IFocusInterface
Private Sub New()
End Sub
Private Shared ReadOnly m_instance As New FocusService
Public Shared ReadOnly Property Instance() As FocusService
Get
Return m_instance
End Get
End Property
Public Sub Focus() Implements IFocusInterface.Focus
Dim rootFrame = TryCast(Application.Current.RootVisual, PhoneApplicationFrame)
If Not rootFrame Is Nothing Then
Dim page = TryCast(rootFrame.Content, PhoneApplicationPage)
If Not page Is Nothing Then
page.Focus()
Else
Throw New Exception("Unable to Cast the Root Frame Content into an Application Page")
End If
Else
Throw New Exception("Unable to Cast the RootVisual into a PhoneApplicationFrame")
End If
End Sub
End Class
ViewModel で IFocusable を実装し、ViewModel が構築された後にフォーカス サービス シングルトンを ViewModel に渡すようにしてください。
Public Class MyViewModel
Implements INotifyPropertyChanged
Implements IFocusable
' Property for the Focus Service
<Xml.Serialization.XmlIgnore()> Public Property FocusService As IFocusInterface Implements IFocusable.FocusService
Public Sub Focus()
If Not FocusService Is Nothing Then
FocusService.Focus()
Else
Throw New Exception("ViewModel hasn't been passed a Focus Service")
End If
End Sub
End Class
Dim tMyViewModel as New MyViewModel
tMyViewModel.FocusService = Vacation_Calc_Model.FocusService.Instance