我使用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.Text
或TextBox
本身作为参数传递给PasteCommandMethod
。
private RelayCommand<Object> _pasteCommand;
public RelayCommand<Object> PasteCommand
{
get
{
return _pasteCommand ?? (_pasteCommand =
new RelayCommand<Object>(PasteCommandMethod));
}
}
private void PasteCommandMethod(Object obj)
{
}
答案 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事件以执行类似于您正在尝试的事情。
命令绑定是另一个部分,如果您需要有关如何设置的更多信息,请告诉我。