我有一個要求,即在加載新視圖時專注於特定的文本框。將用戶控件綁定到自定義BusyIndicator控件
的解決方案是這一行的代碼添加到裝載的事件的看法:
Dispatcher.BeginInvoke(() => { NameTextBox.Focus(); });
所以這個工作了一個觀點,而不是其他。我花了一些時間調試問題,並意識到我正在處理的新視圖有一個BusyIndicator,它將焦點從所有控件中移除,因爲BusyIndicator在OnLoaded事件之後被設置爲true和false。
所以解決的辦法是在後將焦點調用到NameTextBox
我的BusyIndicator已被設置爲false。我的想法是創建一個可重用的BusyIndicator控件來處理這些額外的工作。但是,我在MVVM中遇到了麻煩。
我開始製作工具的簡單擴展:BusyIndicator控件:
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.");
}
我加入了控制我的XAML文件,沒有問題:
<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」引發了異常。 [Line:45 Position:26]
我想嘗試這個解決方案嗎?如果是這樣,到目前爲止我有什麼問題(不能設置ControlToFocusOn
屬性)?
更新1
我安裝了Visual Studio 10點的工具爲Silverlight 5和導航到新視圖時,有一個更好的錯誤消息。現在我格特此錯誤消息:
「System.ArgumentException:類型System.Windows.Data.Binding的對象不能轉換爲類型System.Windows.Controls.UserControl」
另外,我覺得我需要更改此控件的DataContext。在代碼隱藏構造函數中,DataContext被設置爲我的ViewModel。我嘗試添加一個DataContext屬性的EnhancedBusyIndicator
,但沒有奏效:
<my:EnhancedBusyIndicator
DataContext="{Binding RelativeSource={RelativeSource Self}}"
ControlToFocusOn="{Binding ElementName=NameTextBox}"
RemoteFocusIsEnabled="{Binding IsRemoteFocusEnabled}"
IsBusy="{Binding IsDetailsBusyIndicatorActive}"
...
>
更新2
我需要改變UserControl
到Control
,因爲我會希望將焦點設置到TextBox
對象(實現Control
)。但是,這並不能解決問題。
我實際上使用Silverlight 4;我只是通過使用適用於Silverlight 4的Visual Studio 10 Tools for Silverlight 5獲得了更好的錯誤消息,該消息發佈在「Update 1」中。我沒有嘗試將其作爲靜態資源進行綁定。我會試一試。 – 2012-01-16 19:48:45