猿问

从视图模型(C#)对WPF中的TextBox设置焦点

从视图模型(C#)对WPF中的TextBox设置焦点

我有一个TextBox和一个Button在我看来。

现在,我在单击按钮时检查一个条件,如果条件结果为false,则向用户显示消息,然后我必须将光标设置为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}"/>


幕布斯6054654
浏览 1251回答 3
3回答

长风秋雁

我知道这个问题已经被回答了上千次,但我对安瓦卡的贡献做了一些修改,我认为这将帮助其他有类似问题的人。首先,我更改了上述附加财产如下:public static class FocusExtension{     public static readonly DependencyProperty IsFocusedProperty =          DependencyProperty.RegisterAttached("IsFocused", typeof(bool?), typeof(FocusExtension), new FrameworkPropertyMetadata(IsFocusedChanged){BindsTwoWayByDefault = true});     public static bool? GetIsFocused(DependencyObject element)     {         if (element == null)         {             throw new ArgumentNullException("element");         }         return (bool?)element.GetValue(IsFocusedProperty);     }     public static void SetIsFocused(DependencyObject element, bool? value)     {         if (element == null)         {             throw new ArgumentNullException("element");         }         element.SetValue(IsFocusedProperty, value);     }     private static void IsFocusedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)     {         var fe = (FrameworkElement)d;         if (e.OldValue == null)         {             fe.GotFocus += FrameworkElement_GotFocus;             fe.LostFocus += FrameworkElement_LostFocus;         }         if (!fe.IsVisible)         {             fe.IsVisibleChanged += new DependencyPropertyChangedEventHandler(fe_IsVisibleChanged);         }         if ((bool)e.NewValue)         {             fe.Focus();         }     }     private static void fe_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)     {         var fe = (FrameworkElement)sender;         if (fe.IsVisible && (bool)((FrameworkElement)sender).GetValue(IsFocusedProperty))         {             fe.IsVisibleChanged -= fe_IsVisibleChanged;             fe.Focus();         }     }     private static void FrameworkElement_GotFocus(object sender, RoutedEventArgs e)     {         ((FrameworkElement)sender).SetValue(IsFocusedProperty, true);     }     private static void FrameworkElement_LostFocus(object sender, RoutedEventArgs e)     {         ((FrameworkElement)sender).SetValue(IsFocusedProperty, false);     }}我添加可见性引用的原因是选项卡。显然,如果您在初始可见选项卡之外的任何其他选项卡上使用附加属性,则附加属性在手动聚焦控件之前无法工作。另一个障碍是创建一种更优雅的方法,当基础属性失去焦点时,将其重置为false。这就是失去焦点事件出现的原因。<TextBox                 Text="{Binding Description}"     FocusExtension.IsFocused="{Binding IsFocused}"/>
随时随地看视频慕课网APP
我要回答