powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Перехватить событие вставки текста в TextBox
10 сообщений из 10, страница 1 из 1
Перехватить событие вставки текста в TextBox
    #38873006
monstrilla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Разрабатываю (поддерживаю) приложение с использованием MVVM. Есть ДатаГрид , есть ДатаТемплейт , который используется для отображения айтемов в датагриде.

Код: xml
1.
2.
3.
4.
<DataTemplate x:Key="StringTemplate">
    <TextBox Text="{Binding Value, ValidatesOnDataErrors=True, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
    </TextBox>
</DataTemplate>



Понадобилось перехватывать вставку текста в ячейки грида. Чтобы перехватывать вставляемый текст, обрабатывать его.
Обнаружилось, что у ТекстБокса нет события Paste . Вы скажете, что можно использовать событие TextChanged , но не хочу, чтобы метод дергался на каждый ввод символа. Гуглю, нахожу вот такое, но у меня MVVM...

https://social.msdn.microsoft.com/Forums/vstudio/en-US/b52b5b99-1ee0-44b9-bfa5-7186556069ab/detecting-paste-into-textbox

Какие есть идеи?
...
Рейтинг: 0 / 0
Перехватить событие вставки текста в TextBox
    #38873011
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделать Attached Property или Attached Behavior. Упаковать в него работу с CommandManager.ExecutedEvent. Вариантов много...
...
Рейтинг: 0 / 0
Перехватить событие вставки текста в TextBox
    #38873044
monstrilla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей К,

а можно чуть более подробнее? хотя бы в плане алгоритма
...
Рейтинг: 0 / 0
Перехватить событие вставки текста в TextBox
    #38873079
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну сделать Attached Property типа ICommand. Внутри его PropertyChanged сделать подписку на событие CommandManager.ExecutedEvent. Из события вызывать указанный ICommand.
...
Рейтинг: 0 / 0
Перехватить событие вставки текста в TextBox
    #38873086
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как-то так
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
    public class TextBoxHelper
    {
        #region PasteCommand Property

        public static readonly DependencyProperty PasteCommandProperty =
            DependencyProperty.RegisterAttached(
                "PasteCommand",
                typeof(ICommand),
                typeof(TextBoxHelper),
                new FrameworkPropertyMetadata(PasteCommandChanged)
            );

        public static ICommand GetPasteCommand(DependencyObject target)
        {
            return (ICommand)target.GetValue(PasteCommandProperty);
        }

        public static void SetPasteCommand(DependencyObject target, ICommand value)
        {
            target.SetValue(PasteCommandProperty, value);
        }

        static void PasteCommandChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
        {
            var textBox = (TextBox)sender;
            var newValue = (ICommand)e.NewValue;

            if (newValue != null)
                textBox.AddHandler(CommandManager.ExecutedEvent, new RoutedEventHandler(CommandExecuted), true);
            else
                textBox.RemoveHandler(CommandManager.ExecutedEvent, new RoutedEventHandler(CommandExecuted));

        }

        static void CommandExecuted(object sender, RoutedEventArgs e)
        {
            var textBox = (TextBox)sender;
            var command = GetPasteCommand(textBox);

            if (command.CanExecute(null))
                command.Execute(null);
        }

        #endregion
    }


Код: xml
1.
<TextBox TextBoxHelper.PasteCommand="{Binding myCommand}" />
...
Рейтинг: 0 / 0
Перехватить событие вставки текста в TextBox
    #38873091
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну там пару ошибок поправить, но идея должна быть понятна...
...
Рейтинг: 0 / 0
Перехватить событие вставки текста в TextBox
    #38873192
monstrilla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей К,

Спасибо, работает, вроде даже и нет ошибок. прикольный подход. Я что-то подобное пытался делать, но не сообразил сделать тип свойства непосредственно ICommand , мудрил с булевым :)
...
Рейтинг: 0 / 0
Перехватить событие вставки текста в TextBox
    #38873193
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
monstrilla,

просто почитайте как осуществляется взаимодействие от View к ViewModel,
про ICommand, RoutedCommand, RelayCommand, это решает 100 проблем
...
Рейтинг: 0 / 0
Перехватить событие вставки текста в TextBox
    #38873208
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
monstrilla... вроде даже и нет ошибок.Я там забыл добавить: if (((ExecutedRoutedEventArgs)e).Command == ApplicationCommands.Paste)
...
Рейтинг: 0 / 0
Перехватить событие вставки текста в TextBox
    #38873212
monstrilla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes,

буду признателен за линк, если есть

Алексей К

ну я потыкал в контрол, текст пописал, повставлял. команда сработала только на вставку я и решил, что все ок :)
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Перехватить событие вставки текста в TextBox
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]