加载新 View 时,我需要专注于特定的文本框。
解决方案是将以下代码行添加到 View 的OnLoaded事件中:
Dispatcher.BeginInvoke(() => { NameTextBox.Focus(); });
因此,这仅适用于一种观点,但不适用于另一种观点。我花了一些时间来调试问题,并意识到我正在使用的新 View 有一个BusyIndicator,因为在OnLoaded事件发生后将BusyIndicator设置为true和false,所以将焦点从所有控件移开了。
因此解决方案是将我的BusyIndicator的设置为false后,将焦点调用到
NameTextBox
。我的想法是创建一个可重用的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>
所以这个想法是,当我在ViewModel中将
IsRemoteFocusEnabled
设置为true时(在ViewModel中将IsBusy
设置为false后,我将这样做),焦点将设置为NameTextBox
。如果可行,其他人可以使用EnhancedBusyIndicator
并绑定(bind)到其他控件,并在自己的ViewModel中适当地启用焦点,前提是他们的 View 具有初始BusyIndicator
处于 Activity 状态。但是,加载 View 时出现此异常:
设置属性'foo.Controls.EnhancedBusyIndicator.ControlToFocusOn'引发异常。 [线:45位置:26]
我正在尝试使用此解决方案吗?如果是这样,到目前为止我有什么问题(无法设置
ControlToFocusOn
属性)?更新1
我为Silverlight 5安装了Visual Studio 10工具,并导航到新 View 时收到了更好的错误消息。现在我收到此错误消息:
“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
)。但是,这不能解决问题。 最佳答案
@Matt,不确定
DataContext="{Binding RelativeSource={RelativeSource Self}}"
能否在Silverlight 5中工作,您是否尝试将其作为静态资源进行绑定(bind)?
关于c# - 将UserControl绑定(bind)到自定义BusyIndicator控件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8855639/