新しいビューが読み込まれたときに特定のテキストボックスにフォーカスする必要があります。UserControlをカスタムBusyIndicatorコントロールにバインドする
ソリューションは、ビューのOnLoadedイベントにこのコード行を追加しました:
Dispatcher.BeginInvoke(() => { NameTextBox.Focus(); });
は、これは一つのビューのために働いていたではなく、別の。私は問題をデバッグするのに少し時間を費やし、BusyIndicatorがOnLoadedイベントの後にtrueおよびfalseに設定されているので、すべてのコントロールからフォーカスを外すBusyIndicatorが、新しいビューで使用されていることに気付きました。
したがって、のBusyIndicatorがfalseに設定された後に、NameTextBox
にフォーカスを呼び出すことが解決策です。私の考えは、この余分な作業を処理する再利用可能なBusyIndicatorコントロールを作成することでした。しかし、私はMVVMでこれを行うのに苦労しています。
私は、ツールキットの単純な拡張することによって開始:私は何の問題もなく私のXAMLファイルにコントロールを追加
public class EnhancedBusyIndicator : BusyIndicator
{
public UserControl ControlToFocusOn { get; set; }
private bool _remoteFocusIsEnabled = false;
public bool RemoteFocusIsEnabled
{
get
{
return _remoteFocusIsEnabled;
}
set
{
if (value == true)
EnableRemoteFocus();
}
}
private void EnableRemoteFocus()
{
if (ControlToFocusOn.IsNotNull())
Dispatcher.BeginInvoke(() => { ControlToFocusOn.Focus(); });
else
throw new InvalidOperationException("ControlToFocusOn has not been set.");
}
:BusyIndicatorを
<my:EnhancedBusyIndicator
ControlToFocusOn="{Binding ElementName=NameTextBox}"
RemoteFocusIsEnabled="{Binding IsRemoteFocusEnabled}"
IsBusy="{Binding IsDetailsBusyIndicatorActive}"
...
>
...
<my:myTextBox (this extends TextBox)
x:Name="NameTextBox"
...
/>
...
</my:EnhancedBusyIndicator>
IsRemoteFocusEnabled
があるときにアイデアがありますViewModelでtrueに設定されています(これはViewModelでIsBusy
をfalseに設定した後に行います)、フォーカスはNameTextBox
に設定されます。それがうまくいけば、他の人がEnhancedBusyIndicator
を使用し、別のコントロールにバインドして、自分のViewModels内で適切にフォーカスを有効にできます。ビューの初期値はBusyIndicator
です。ビューがロードされたときに
はしかし、私はこの例外を取得:プロパティ「foo.Controls.EnhancedBusyIndicator.ControlToFocusOn」
設定が例外をスローしました。 [行:45位置:26]
私はこのソリューションを試していますか?もしそうなら、私がこれまでに持っていたもので何が間違っていますか(ControlToFocusOn
プロパティを設定できません)?
アップデート1
私は、Visual StudioにSilverlightの5のための10個のツールをインストールし、新しいビューにナビゲートするときに、より良いエラーメッセージが表示されました。今、私はこのエラーメッセージをGeteの:
:また
を「System.ArgumentExceptionのタイプSystem.Windows.Data.BindingのオブジェクトがSystem.Windows.Controls.UserControl型に変換することができない」、私は私がする必要があると思いますこのコントロールのDataContextを変更します。コードビハインドコンストラクタでは、DataContextがMy ViewModelに設定されます。私はEnhancedBusyIndicator
にDataContextプロパティを追加しようとしたが、それはうまくいきませんでした:
<my:EnhancedBusyIndicator
DataContext="{Binding RelativeSource={RelativeSource Self}}"
ControlToFocusOn="{Binding ElementName=NameTextBox}"
RemoteFocusIsEnabled="{Binding IsRemoteFocusEnabled}"
IsBusy="{Binding IsDetailsBusyIndicatorActive}"
...
>
アップデート2
私はにフォーカスを設定したいされますので、私はControl
にUserControl
を変更する必要がありますTextBox
オブジェクト(Control
を実装しています)。しかし、これでは問題は解決しません。
私は実際にSilverlight 4を使用しています。 Silverlight 4用にVisual Studio 10 Tools for Silverlight 5を使用して「Update 1」に投稿したより良いエラーメッセージを取得できました。私は静的リソースとしてバインドしようとしていません。私はそれを試してみましょう。 –