在视图模型(C#)中将焦点放在WPF中的文本框上

我有一个TextBox和一个Button在我的视图。

现在我在按钮点击检查条件,如果条件结果是假,显示消息给用户,然后我必须设置光标到TextBox控件。

if (companyref == null)
{
    var cs = new Lipper.Nelson.AdminClient.Main.Views.ContactPanels.CompanyAssociation(); 

    MessageBox.Show("Company does not exist.", "Error", MessageBoxButton.OK,
                    MessageBoxImage.Exclamation);

    cs.txtCompanyID.Focusable = true;

    System.Windows.Input.Keyboard.Focus(cs.txtCompanyID);
}

上面的代码是在ViewModel中。

CompanyAssociation是视图名称。

但是光标没有在TextBox中设置。

xaml是:

<igEditors:XamTextEditor Name="txtCompanyID" 
                         KeyDown="xamTextEditorAllowOnlyNumeric_KeyDown"
                         ValueChanged="txtCompanyID_ValueChanged"
                         Text="{Binding Company.CompanyId,
                             Mode=TwoWay,
                             UpdateSourceTrigger=PropertyChanged}"
                         Width="{Binding ActualWidth, ElementName=border}"
                         Grid.Column="1" Grid.Row="0"
                         VerticalAlignment="Top"
                         HorizontalAlignment="Stretch"
                         Margin="0,5,0,0"
                         IsEnabled="{Binding Path=IsEditable}"/>

<Button Template="{StaticResource buttonTemp1}"
        Command="{Binding ContactCommand}"
        CommandParameter="searchCompany"
        Content="Search"
        Width="80"
        Grid.Row="0" Grid.Column="2"
        VerticalAlignment="Top"
        Margin="0"
        HorizontalAlignment="Left"
        IsEnabled="{Binding Path=IsEditable}"/>
让我分三部分回答你的问题。

>我想知道什么是“cs.txtCompanyID”在您的示例中?它是一个TextBox控件?如果是,那么你的方式错了。一般来说,在ViewModel中有任何对UI的引用不是一个好主意。你可以问“为什么?但这是另一个问题发布在Stackoverflow :)。
>跟踪焦点的问题的最好方法是…调试.Net源代码。没有开玩笑。它节省了我很多时间很多次。要启用.net源代码调试,请参阅Shawn Bruke’s博客。
>最后,我用来从ViewModel设置焦点的一般方法是附加属性。我写了非常简单的附加属性,可以在任何UIElement上设置。并且它可以绑定到ViewModel的属性“IsFocused”。这里是:

public static class FocusExtension
{
    public static bool GetIsFocused(DependencyObject obj)
    {
        return (bool) obj.GetValue(IsFocusedProperty);
    }

    public static void SetIsFocused(DependencyObject obj, bool value)
    {
        obj.SetValue(IsFocusedProperty, value);
    }

    public static readonly DependencyProperty IsFocusedProperty =
        DependencyProperty.RegisterAttached(
            "IsFocused", typeof (bool), typeof (FocusExtension),
            new UIPropertyMetadata(false, OnIsFocusedPropertyChanged));

    private static void OnIsFocusedPropertyChanged(
        DependencyObject d, 
        DependencyPropertyChangedEventArgs e)
    {
        var uie = (UIElement) d;
        if ((bool) e.NewValue)
        {
            uie.Focus(); // Don't care about false values.
        }
    }
}

现在在您的视图(在XAML)中,您可以将此属性绑定到您的ViewModel:

<TextBox local:FocusExtension.IsFocused="{Binding IsUserNameFocused}" />

希望这可以帮助 :)。如果它不参考答案#2。

干杯。

http://stackoverflow.com/questions/1356045/set-focus-on-textbox-in-wpf-from-view-model-c

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:在视图模型(C#)中将焦点放在WPF中的文本框上