Вы можете создать прикрепленное поведение для 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-совместимой в представлении и упаковывается как повторно используемый компонент в качестве бонуса.