加载新 View 时,我需要专注于特定的文本框。

解决方案是将以下代码行添加到 View 的OnLoaded事件中:

Dispatcher.BeginInvoke(() => { NameTextBox.Focus(); });

因此,这仅适用于一种观点,但不适用于另一种观点。我花了一些时间来调试问题,并意识到我正在使用的新 View 有一个BusyIndi​​cator,因为在OnLoaded事件发生后将BusyIndi​​cator设置为true和false,所以将焦点从所有控件移开了。

因此解决方案是将我的BusyIndi​​cator的设置为false后,将焦点调用到NameTextBox 。我的想法是创建一个可重用的BusyIndi​​cator控件来处理这项额外的工作。但是,我在MVVM中这样做很麻烦。

我首先对工具箱进行了简单的扩展:BusyIndi​​cator:
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.EnhancedBusyIndi​​cator.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)到自定义BusyIndi​​cator控件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8855639/

10-11 13:15