MVVM捕获文本框粘贴事件

时间:2016-06-21 14:21:26

标签: c# wpf 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 粘贴事件重现此命令并调用命令? 我可以成功绑定 Enter Key事件,但如何绑定粘贴事件

下面是我在新MVVM中绑定 Icommand 的代码片段( Enter Key listener

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

2 个答案:

答案 0 :(得分: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
    }
}

答案 1 :(得分:0)

在MVVM中,文本框绑定到VM上的属性。为什么不简单地订阅VM的通知属性更改(可以在VM本身实际上完成)并查找在该绑定属性上报告的更改。

发送更改通知后,请执行所需的逻辑。

示例

这个工作示例不会在现实世界中使用,因为工作将在Name 的设置器中完成,演示如何订阅notify事件。更改Name后,VM将捕获事件中的更改,并计算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#中重写。