MVVM和Prism-如何处理ViewModel中的TextBox_dragenter和TextBox_Drop事件



我正在学习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拖放框架。

相关内容

  • 没有找到相关文章

最新更新