Как я могу установить фокус на DecimalUpDown через базу команд кнопки при проверке - PullRequest
0 голосов
/ 04 августа 2020

Код просмотра XAML

<xctk:DecimalUpDown Value="{Binding InitialDepositAmount, Mode=TwoWay}" Minimum="{Binding MinimumAllowedAmount}" Maximum="{Binding MaximumAllowedAmount}" HorizontalAlignment="Right" Grid.Column="1" VerticalAlignment="Center" Width="120" Height="21" Margin="5 0 0 0" />

<xctk:DecimalUpDown Value="{Binding CardPaymentAmount, Mode=TwoWay}" Minimum="{Binding MinimumAllowedAmount}" Maximum="{Binding MaximumAllowedAmount}" HorizontalAlignment="Right" Grid.Column="1" VerticalAlignment="Center" Width="120" Height="21" Margin="5 0 0 0" />

<Button Command="{Binding ProccessButtonCommand}" BorderBrush="#a7a7a7" BorderThickness="1" Grid.Column="0" HorizontalContentAlignment="Left" Width="162" Height="42" Margin="0 10 0 0">

Код ViewModel


 private void ExecuteProccessButtonCommand(object obj)
 {
    if (InitialDepositAmount == 100)
    //Focus Initial Depostit DecimalUpDown
    if (CardPaymentAmount== 100)
    //Focus Card Payment DecimalUpDown
 }

 private DelegateCommand<object> _proccessButtonCommand;
 public DelegateCommand<object> ProccessButtonCommand =>
    _proccessButtonCommand ? ? (_proccessButtonCommand = new DelegateCommand<object> (ExecuteProccessButtonCommand));

Лог c выглядит следующим образом. Мне нужен только подход, использующий только MVVM.

1 Ответ

1 голос
/ 04 августа 2020

Вы можете создать прикрепленное поведение для DecimalUpDown с условием и целевой кнопкой. Для этого вам нужно использовать пакет NuGet Microsoft.Xaml.Behaviors.Wpf.

public class FocusConditionBehavior : Behavior<DecimalUpDown>
{
   public static readonly DependencyProperty TargetProperty = DependencyProperty.Register(
      nameof(Target), typeof(ButtonBase), typeof(FocusConditionBehavior), new PropertyMetadata(null, OnTargetChanged));

   public static readonly DependencyProperty ConditionProperty = DependencyProperty.Register(
      nameof(Condition), typeof(bool), typeof(FocusConditionBehavior), new PropertyMetadata(false));

   public ButtonBase Target
   {
      get => (ButtonBase)GetValue(TargetProperty);
      set => SetValue(TargetProperty, value);
   }

   public bool Condition
   {
      get => (bool)GetValue(ConditionProperty);
      set => SetValue(ConditionProperty, value);
   }

   private static void OnTargetChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
   {
      ((FocusConditionBehavior)d).OnTargetChanged((ButtonBase)e.OldValue, (ButtonBase)e.NewValue);
   }

   private void OnTargetChanged(ButtonBase oldButtonBase, ButtonBase newButtonBase)
   {
      if (oldButtonBase != null)
         oldButtonBase.Click -= OnClick;

      if (newButtonBase != null)
         newButtonBase.Click += OnClick;
   }

   private void OnClick(object sender, RoutedEventArgs e)
   {
      if (Condition)
         Keyboard.Focus(AssociatedObject);
   }
}

Создайте в своей модели представления свойства bool, которые представляют условия. Убедитесь, что вы обновляете эти свойства, используя INotifyPropertyChanged, когда соответствующие свойства данных меняются, чтобы уведомить пользовательский интерфейс об изменениях.

public bool IsInitialDepositAmountMatching
{
   get
   {
      // You are free to add any conditions here
      return InitialDepositAmount == 100;
   }
}

Затем назначьте имя кнопке, которая должна запускать оценку условий и фокусировку, например, TestButton и прикрепите beahvior с соответствующими привязками к DecimalUpDown s.

<xctk:DecimalUpDown>
   <b:Interaction.Behaviors>
      <local:FocusConditionBehavior Condition="{Binding IsInitialDepositAmountMatching}"
                                    Target="{Binding ElementName=TestButton}"/>
   </b:Interaction.Behaviors>
</xctk:DecimalUpDown>
<xctk:DecimalUpDown>
   <b:Interaction.Behaviors>
      <local:FocusConditionBehavior Condition="{Binding IsCardPaymentAmountMatching}"
                                    Target="{Binding ElementName=TestButton}"/>
   </b:Interaction.Behaviors>
</xctk:DecimalUpDown>

Таким образом, фокусировка обрабатывается MVVM-совместимой в представлении и упаковывается как повторно используемый компонент в качестве бонуса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...