У меня есть TextBox на MVCM-разработанном UserControl. Я должен выделить весь текст в TextBox, если в ViewModel выполнены некоторые условия, а также проверить, выделен ли весь текст.
Я много искал, как я могу это реализовать, и, наконец, я попытался использовать присоединенное свойство.
Моя собственность
public static class TextBoxExtension
{
public static readonly DependencyProperty IsSelectedAllProperty =
DependencyProperty.RegisterAttached
(
"IsSelectedAll",
typeof(bool?),
typeof(TextBoxExtension),
new FrameworkPropertyMetadata(IsSelectedAllChanged) { BindsTwoWayByDefault = true }
);
public static bool? GetIsSelectedAll(DependencyObject element)
{
if (element is null)
throw new ArgumentNullException("element");
return (bool?)element.GetValue(IsSelectedAllProperty);
}
public static void SetIsSelectedAll(DependencyObject element, bool? value)
{
if (element is null)
throw new ArgumentNullException("element");
element.SetValue(IsSelectedAllProperty, value);
}
private static void IsSelectedAllChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
TextBox textbox = (TextBox)d;
bool? oldValue = e.OldValue as bool?;
bool? newValue = e.NewValue as bool?;
if (oldValue is null)
{
textbox.GotFocus += SetIsSelectedAllProperty;
textbox.LostFocus += SetIsSelectedAllProperty;
textbox.SelectionChanged += SetIsSelectedAllProperty;
}
if (newValue == true)
{
textbox.Focus();
textbox.SelectAll();
}
}
private static void SetIsSelectedAllProperty(object sender, RoutedEventArgs e)
{
TextBox textBox = sender as TextBox;
textBox.SetValue
(
dp: IsSelectedAllProperty,
value:
textBox.IsFocused &&
textBox.SelectedText == textBox.Text
);
}
}
Мое текстовое поле из вида:
<TextBox local:TextBoxExtension.IsSelectedAll="{Binding IsSelectedAll}"/>
В большинстве случаев работает отлично, но есть проблема, когда я пытаюсь выделить текст от конца до начала текста с помощью мыши: когда выделение достигает 1-го символа, все выделение немедленно исчезает.
Почему это радует и как я могу это исправить? Пожалуйста, помогите!