在XAML中将函数绑定到MouseDown事件?

7

我目前正在学习WPF和C#编程,但在理解绑定等方面遇到了困难。

我卡在将“绑定”函数或命令绑定到我的网格中的XAML对象上。

<Image x:Name="BlkRook1" Source="../Data/BlkRook.png" Grid.Row="{Binding Path=ChessPieces[0].Row}" Grid.Column="{Binding Path=ChessPieces[0].Column}" MouseDown="{Binding Path=ChessPieces[0].Move()}"/>

这段代码 MouseDown="{Binding Path=ChessPieces[0].Move()}" 没有起作用,但显示了我想要实现的内容。

在我的视图模型中,我定义了一个列表,并用不同的棋子实例填充了它,然后计划将每个图像绑定到该列表中的一个实例。

我正在尝试绑定MouseDown函数,目前看来,如果我将函数放在Mainwindow.xaml.cs文件中,它可以访问它。但我希望它能够从模型中访问。

Mainwindow.xaml.cs

namespace TheGame.Views
{
    public partial class MainWindow : Window   
    {
        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = new ChessBoardViewModel();
        }

    }
}

目前BlkRook对象已经定义了行、列、名称和一个名为move的函数。

错误信息:

“'TheGame.Views.MainWindow'未包含'Move'的定义,也未找到接受类型为'TheGame.Views.MainWindow'的第一个参数的扩展方法'Move'(是否缺少using指令或程序集引用?)”

那么,如何将在Model对象中定义的函数绑定到XAML对象中?

谢谢

/ Martin


为什么不将View命令绑定到一个新的ViewModel方法,然后从相应的Model对象调用Move方法呢?因此:View-ViewModel-Model。 - bland
@bland 这不是在喊叫吗,比如说“无法在类型为'Border'的'AddMouseDownHandler'属性上设置'Binding'。'Binding'只能在DependencyObject的DependencyProperty上设置。”? - Artfaith
1个回答

20

您无法绑定到方法。由于您正在使用MVVM,我建议您将附加属性与命令结合使用。您还可以使用MouseBinding类:http://msdn.microsoft.com/en-us/library/system.windows.input.mousebinding(v=vs.110).aspx。 Commandbinding在这里有很好的解释:http://www.danharman.net/2011/08/05/binding-wpf-events-to-mvvm-viewmodel-commands/

<Button>
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="MouseDown" >
            <i:InvokeCommandAction Command="{Binding MouseDownCommand}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
</Button>

感谢您的回答和提供的链接,真的解释了很多。 - Martin
1
不幸的是,在命令中,无法再获取对“Button”的引用。此外,“MouseDown”事件的参数在哪里,例如按下了哪个按钮的指示(而不需要使用第三方库,如链接文章中提到的那个)? - O. R. Mapper
1
你可以使用InvokeCommandAction的CommandParameter属性。 - Florian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接