我正在使用LiveCharts库开发一个WPF应用程序,特别是CartesianChart控件。我想在我的ViewModel中处理CartesianChart的MouseLeftButtonDown和MouseRightButtonDown事件,但我在使其工作时遇到了问题。
我已经在ViewModel中添加了事件处理程序,并将它们绑定到XAML代码中的事件,如下所示:
<lvc:CartesianChart
x:Name="LibSpeed"
DockPanel.Dock="Top"
Series="{Binding SeriesCollection}"
XAxes="{Binding XAxes}"
YAxes="{Binding YAxes}"
MouseLeftButtonDown="ChartMouseLeftButtonDownCommand"
MouseRightButtonDown="ChartMouseRightButtonDownCommand">
</lvc:CartesianChart>
在我的ViewModel中:
private ICommand chartMouseLeftButtonDownCommand;
public ICommand ChartMouseLeftButtonDownCommand
{
get => chartMouseLeftButtonDownCommand ?? (chartMouseLeftButtonDownCommand = new CommandHandler((parameter) =>
{
if (parameter is MouseEventArgs args)
{
var mousePosition = args.GetPosition(null);
var x = mousePosition.X;
var y = mousePosition.Y;
if (lutLibrary.XValuesReduced.Contains(x) && lutLibrary.YValuesReduced.Contains(y))
{
lutLibrary.YValuesReduced = lutLibrary.YValuesReduced.Where(val => val != y).ToArray();
lutLibrary.XValuesReduced = lutLibrary.XValuesReduced.Where(val => val != x).ToArray();
}
}
}, () =>
{
return true;
}));
}
private ICommand chartMouseRightButtonDownCommand;
public ICommand ChartMouseRightButtonDownCommand
{
get => chartMouseRightButtonDownCommand ?? (chartMouseRightButtonDownCommand = new CommandHandler((parameter) =>
{
if (parameter is MouseEventArgs args)
{
var mousePosition = args.GetPosition(null);
var xValue = mousePosition.X; // Mausposition für den x-Wert
var yValue = mousePosition.Y; // Mausposition für den y-Wert
lutLibrary.YValuesReduced.Append(yValue);
lutLibrary.XValuesReduced.Append(xValue);
MainWindow_ViewModel.initPoints();
}
}, () =>
{
return true;
但是,无法识别事件处理程序,我收到一条错误消息,代码无法运行。谁能帮助我理解为什么事件处理程序不能按预期工作?
提前感谢您的帮助!
1条答案
按热度按时间1l5u6lss1#
事件处理程序需要与事件的委托匹配。
在这种情况下,您的事件处理程序方法需要采用以下形式:
它们将在视图的代码隐藏中,而不是在视图模型中。请注意,在上面的代码中,这是程序期望找到它们的地方,因为您没有为它们使用数据绑定。
https://learn.microsoft.com/en-us/dotnet/api/system.windows.input.mousebuttoneventhandler?view=windowsdesktop-7.0
您可以在视图的代码隐藏中定义事件处理程序,并从那里调用视图模型中的命令--这是一种符合MVVM的快速简便的方法。就像这样:
您可以在xaml中设置处理程序,如下所示: