我正在学习MVVM和PRISM,并尝试处理文本框的Drop and Dragenter事件。
我已经成功地为按钮单击了
public ButtonsViewModel()
{
//If statement is required for viewing the MainWindow in design mode otherwise errors are thrown
//as the ButtonsViewModel has parameters which only resolve at runtime. I.E. events
if (!(bool)DesignerProperties.IsInDesignModeProperty.GetMetadata(typeof(DependencyObject)).DefaultValue)
{
svc = ServiceLocator.Current;
events = svc.GetInstance<IEventAggregator>();
events.GetEvent<InputValidStatus>().Subscribe(SetInputStatus);
StartCommand = new DelegateCommand(ExecuteStart, CanExecute).ObservesProperty(() => InputStatus);
ExitCommand = new DelegateCommand(ExecuteExit);
}
}
private bool CanExecute()
{
return InputStatus;
}
private void ExecuteStart()
{
InputStatus = true;
ERA Process = new ERA();
Proces.Run();
}
这可以正常工作,并且没有任何不参加EventArgs的事件的问题。因此,由于我不需要与EventArgs进行交互,因此可以实现Drop方法。
但是,使用TextBox_Dragenter事件,它设置了TextBox的DragDropeFfects
private void TextBox_DragEnter(object sender, DragEventArgs e)
{
e.Effects = DragDropEffects.Copy;
}
我的第一个想法是创建一个ICommand并将其绑定到TextBox_Dragenter事件,并且在ViewModel中具有此更新DragDropeFffects属性。但是我看不到如何将效果绑定到文本框。
我可能在想这个错误。这样做的正确方法是什么?
我知道我可以轻松地在后面的代码中设置这些事件,但是我不想这样做,并纯粹使用MVVM模式
保持它。希望这是有道理的。
另一个相互作用触发了解决方案,类似于凯文(Kevin)提出的问题,但这将与Prism(非MVVMlight Solution)一起使用。
需要:
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xaml:
<TextBox Name="TextBox" Text="{Binding MVFieldToBindTo, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" >
<i:Interaction.Triggers>
<i:EventTrigger EventName="DragEnter">
<i:InvokeCommandAction
Command="{Binding BoundCommand}"
CommandParameter="{Binding Text, ElementName=TextBox}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</TextBox>
BoundCommand将是视图模型中的授权程序。看来您有一个好主意。这是使用Dragenter编写的,但是我只在实践中将其用于Lostfocus事件,因此您可能必须对此进行一些效果。它应该使您朝正确的方向前进。
您可以使用互动事件触发触发命令在您的ViewModel中发射命令。例如,下面我将命令X接线到ROWACTIVED事件。这使用MVVMlight EventTocommand助手。将此代码放在您的控件中
<i:Interaction.Triggers>
<i:EventTrigger EventName="RowActivated">
<commands:EventToCommand Command="{Binding X}" PassEventArgsToCommand="True"/>
</i:EventTrigger>
</i:Interaction.Triggers>
您需要的名称空间
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:commands="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras"
可以查看gongsolutions.wpf.dragdrop,以易于使用mvvm-able拖放框架。