2016-06-21 4 views
0

Я попытался преобразовать это (из старого приложения) в шаблон MVVM, но я не вижу, как это сделаю.Событие вставки текстового поля MVVM

textBoxLoader.AddHandler(CommandManager.ExecutedEvent, new RoutedEventHandler(PasteFunction), true); 

    private void PasteFunction(object sender, RoutedEventArgs e) 
     {  
      if ((e as ExecutedRoutedEventArgs).Command == ApplicationCommands.Paste) 
      {    
       // verify that the textbox handled the paste command 

       textBoxLoader.IsEnabled = false; 
       List<string[]> MachineList = new List<string[]>(); 
       List<string> list = new List<string>(Regex.Split(textBoxLoader.Text, Environment.NewLine)); 
}} 

Как я могу воспроизвести это и вызвать команду из WPF TextBox Вставить событие? Я могу успешно связать Введите ключевое событие, но как мне привязать Вставить событие?

Ниже приведен фрагмент кода на том, как я связывание ICommand в новом MVVM (Enter Key слушателя)

<UserControl.InputBindings> 
     <KeyBinding Key="Enter" Command="{Binding ClickCommand}" CommandParameter="{Binding Text, ElementName=textBoxLoader}"/> 
    </UserControl.InputBindings> 
+0

Попробуйте эту тему ... http://stackoverflow.com/questions/28346652/wpf-mvvm-how- to-handle-textbox-paste-event-in-the-viewmodel/28365540 # 28365540 – Peekay

ответ

2

Ввиду:

<TextBox Text="{Binding Text, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Width="120" Height="200"/> 

В модели представления:

class MainWindowViewModel : BindableBase 
{ 
    private string text; 

    public string Text 
    { 
     get { return text; } 
     set { SetProperty(ref text, value); } 
    } 
} 

Таким образом, при вставке текста или нажмите Ctrl + V значение Text обновляется и PropertyChanged событие является поднял. Таким образом, вы можете идентифицировать вложенный текст в текстовое поле.

Если вы хотите, чтобы определить, Ctrl + V для какой-то особой причины, попробуйте следующее:

void AssociatedObject_PreviewKeyDown(object sender, KeyEventArgs e) 
{ 
    if (Keyboard.Modifiers == ModifierKeys.Control && e.Key == Key.V) 
    { 
      // Your action 
    } 
} 
+0

с его mvvm у меня не должно быть обратного кода, если я использую previewkeydown. Я могу использовать функцию i, которую выкладывали сверху: private void PasteFunction (отправитель объекта, RoutedEventArgs e). iahve, чтобы сделать everithing между моделью просмотра/просмотра с помощью Icommand и привязкой ко мне – Zwan

+0

Если вы тоже недовольны своей собственностью, попробуйте что-то вроде этого. http://stackoverflow.com/questions/28346652/wpf-mvvm-how-to-handle-textbox-paste-event-in-the-viewmodel ** У вас не может быть пустой код и добиться того, что вам нужно , если только вы не делаете это с собственными изменениями. ** Вы всегда можете видеть код, связанный с кодом, в коде.Он не нарушает шаблон MVVM. В любом случае, дайте ссылку выше. Это помогает направить команду ** Paste ** на модель представления. – ViVi

+0

да, я не могу действовать на команду вставки в чистом wpf-MV, но вы указали мне только код corect, чтобы заботиться только о propertyChanged.so мне даже не нужно заботиться о «Enter» или «ctrl + v». – Zwan

0

В MVVM текстовое поле привязано к собственности на VM. Почему бы просто не подписаться на изменение свойства уведомления VM (можно было сделать на самой виртуальной машине) и искать изменения, сообщаемые об этом связанном свойстве.

После отправки уведомления об изменении необходимо выполнить необходимую логику.

Пример

Этот рабочий пример, не будет использоваться в реальном мире, потому что работа будет сделана в сеттер Name, показывает, как подписаться на уведомления события. Когда изменяется Name, виртуальная машина улавливает изменение из события и вычисляется FullName, а измененное свойство повышается на FullName из подписки.

public class ExampleVM : INotifyPropertyChanged 
{ 
    private string _Name; 

    public string Name 
    { 
     get { return _Name; } 
     set { _Name = value; OnPropertyChanged(); } 
    } 

    public string FullName { get; set; } 

    public ExampleVM() 
    { 
     this.PropertyChanged += (s, a) => 
     { 
      if (a.PropertyName == "Name") 
      { 
       FullName = $"Mr. {Name}"; 
       OnPropertyChanged("FullName"); 
      } 
     }; 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

C# 6 кодирование используется, но может быть переписано в любой другой версии C#.

+0

Есть ли у вас пример? – Zwan

+0

@ Zwan см. Пример. – OmegaMan

Смежные вопросы