Wpf MVVM如何在ViewModel中处理TextBox“粘贴事件”

时间:2015-02-05 14:35:26

标签: c# wpf mvvm textbox paste

我使用MVVM模式开发应用程序。我使用MVVMLight库来做到这一点。因此,如果我需要处理TextBox TextChange事件,我会在XAML中编写:

<I:EventTrigger EventName="TextChanged">
    <I:InvokeCommandAction Command="{Binding PropertyGridTextChange}"/>
</I:EventTrigger>

PropertyGridTextChange中的Command ViewModel。但是TextBox没有Paste事件!

This 解决方案仅在应用程序不使用MVVM模式时有效,因为您需要在TextBox上建立链接。

<DataTemplate x:Key="StringTemplate">
    <TextBox Text="{Binding Value, ValidatesOnDataErrors=True, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
    </TextBox>
</DataTemplate>

重要细节 - TextBox位于DataTemplate内。 我不知道如何处理&#34;粘贴事件&#34;。 我希望在将文字粘贴到PasteCommand时调用TextBox。我需要将TextBox.TextTextBox本身作为参数传递给PasteCommandMethod

private RelayCommand<Object> _pasteCommand;
public RelayCommand<Object> PasteCommand
{
    get
    {
        return _pasteCommand ?? (_pasteCommand =
            new RelayCommand<Object>(PasteCommandMethod));
    }
}

private void PasteCommandMethod(Object obj)
{
} 

2 个答案:

答案 0 :(得分:6)

我可以建议回答我的问题。

<强>类帮手。

public class TextBoxPasteBehavior 
{
public static readonly DependencyProperty PasteCommandProperty =
    DependencyProperty.RegisterAttached(
        "PasteCommand",
        typeof(ICommand),
        typeof(TextBoxPasteBehavior),
        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)
{
    if (((ExecutedRoutedEventArgs)e).Command != ApplicationCommands.Paste) return;

    var textBox = (TextBox)sender;
    var command = GetPasteCommand(textBox);

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

在XAML中使用。TextBox属性中。

TextBoxPasteBehavior.PasteCommand="{Binding PropertyGridTextPasted}"

PropertyGridTextPasted - ViewModel中的命令。

答案 1 :(得分:0)

最近几天我一直在努力解决这类问题。我的第一种方法是在VM中绑定一个属性文本框(我相信你已经拥有)。然后将ICommand绑定到事件以处理on paste事件:

            xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="RowEditEnding">
                <i:InvokeCommandAction Command="{Binding DocRowEdit}"/>
            </i:EventTrigger>
        </i:Interaction.Triggers>

您需要在XAML代码的适当部分中定义命名空间,然后将交互触发器作为文本框定义的一部分。在这里,我捕获RowEditEnding事件以执行类似于您正在尝试的事情。

命令绑定是另一个部分,如果您需要有关如何设置的更多信息,请告诉我。