我认为a TextBox和a Button。
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是视图名称。
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上发布的另一个问题:)。
跟踪Focus问题的最佳方法是…调试.Net源代码。别开玩笑了 它节省了我很多时间。要启用.net源代码调试,请参阅Shawn Bruke的博客。
最后,我用来从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. } }
}
现在,在您的View(在XAML中)中,您可以将此属性绑定到您的ViewModel:
<TextBox local:FocusExtension.IsFocused="{Binding IsUserNameFocused}" />
希望这可以帮助 :)。如果不是,请参考答案2。
干杯。