У меня есть a TextBox
и a 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. Вы можете спросить "Почему?" но это еще один вопрос для публикации в Stackoverflow:).
Лучший способ отследить проблемы с Focus - это ... отладка исходного кода .Net. Без шуток. Это много раз экономило мне много времени. Чтобы включить отладку исходного кода .net, обратитесь к блогу Шона Брука .
Наконец, общий подход, который я использую для установки фокуса из ViewModel, - это прикрепленные свойства. Я написал очень простое вложенное свойство, которое можно установить на любом UIElement. И его можно связать, например, со свойством ViewModel IsFocused. { public static bool GetIsFocused (объект DependencyObject) { return (bool) obj.GetValue (IsFocusedProperty); } public static void SetIsFocused (объект DependencyObject, значение типа bool) { obj.SetValue (IsFocusedProperty, значение); } общедоступный статический только для чтения DependencyProperty IsFocusedProperty = DependencyProperty.RegisterAttached ( "IsFocused", typeof (bool), typeof (FocusExtension), новый UIPropertyMetadata (false, OnIsFocusedPropertyChanged)); частный статический void OnIsFocusedPropertyChanged ( DependencyObject d, DependencyPropertyChangedEventArgs e) { var uie = (UIElement) d; если ((bool) e.NewValue) { uie.Focus (); // Плевать на ложные значения. } } }
Теперь в вашем представлении (в XAML) вы можете привязать это свойство к вашей ViewModel:
Надеюсь, это поможет :). Если это не относится к ответу №2.
Ура.
System.Windows.Forms.Application.DoEvents();
Keyboard.Focus(tbxLastName);