问题描述
|
我有以下代码来处理由拇指控件引发的鼠标拖动事件。它可以在后面的标准代码(例如SettingView.xaml和SettingView.xaml.cs)上正常工作
但是如何在我的Settingviewmodel.cs文件中处理此问题。
到目前为止,我已经能够使用带有参数的DelegateCommand(或RelayCommand)来连接点击,但是如何从事件发送的参数中获取输入呢?例如,拖动事件提供事件参数e.HorizontalChange和e.VerticalChange。请看下面我的代码原型。
任何优雅的解决方案都倍受赞赏。
提前致谢。
================================================== ===============================
SettingView.xaml
拇指名称= \“ thumbWest \” DragDelta = \“ thumbWest_DragDelta
SettingView.xaml.cs
private void thumbWest_DragDelta(object sender,System.Windows.Controls.Primitives.DragDeltaEventArgs e)
{
_captureMargin.Left = _captureMargin.Left + e.HorizontalChange;
if (e.HorizontalChange < 0)
{
// Drag towards West
_widthRect = _widthRect + Math.Abs(e.HorizontalChange);
}
if (e.HorizontalChange > 0)
{
// Drag towards East
_widthRect = _widthRect - e.HorizontalChange;
}
}
解决方法
MVVM讨论通过直接将ViewModel中声明的Command绑定到View来摆脱后面的代码。这对于具有ICommand属性的Button之类的控件很有用,您可以在其中绑定命令。但是,在所有其他情况下,如果控件未公开ICommand或我们希望在异常事件上具有特定行为,则可以使用以下两种方法之一:
1-如果我想要一个简单的方法,我定义一个事件处理程序,并从事件处理程序中调用特定参数的ViewModel命令(RelayCommand)。在您的情况下,代码将如下所示-
private void thumbWest_DragDelta(object sender,System.Windows.Controls.Primitives.DragDeltaEventArgs e)
{
viewModel.DoSomthingCommand.Execute(new DoSomethingCommandParam(e.HorizontalChange))
}
尽管我们在这里向后面的代码添加代码,但我感觉很好,因为我们没有在偶数处理程序中添加任何UI逻辑。它仅在具有适当参数的ViewModel中执行Command。
2-如果我完全反对在代码中放置任何代码,我将创建一个附加行为来处理拖放并将其附加到控件。然后从附加行为调用ViewModel命令。
您可以在此处找到有关使用“附加行为”的不错的教程