WPF, MVVM,以及嵌套用户控件的事件处理

本文关键字:控件 事件处理 用户 MVVM WPF 嵌套 | 更新日期: 2023-09-27 18:11:15

我有一个WPF应用程序,我正试图实现MVVM。主窗口有一个视图模型和一个自定义用户控件。此用户控件包含一个文本框和一个按钮,并共享来自主父窗口的数据上下文。一切都很好……

我已经能够将文本框绑定到视图模型中的变量,并且它成功地工作。但是…无论如何,我都无法将事件处理程序从按钮绑定到视图模型。我一直收到以下错误:

Unable to cast object of type 'System.Reflection.RuntimeEventInfo' to type 'System.Reflection.MethodInfo'.

我知道这是一个常见的问题与那些新的MVVM。我已经在网上搜索过了,但似乎没有任何效果。谁能解释一下我到底做错了什么?

下面是一些示例代码:主窗口:

<Window x:Class="Mvvm.View.MainWindowView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:view="clr-namespace:ZeeZor.Kiosk.Mvvm.View"
        WindowStyle="None"
        WindowState="Maximized" >
    <Grid >
        <view:ControlPanelView
            Margin="5, 0, 5, 0"
            HorizontalAlignment="Stretch"
            VerticalAlignment="Stretch" >
        </view:ControlPanelView>            
    </Grid>
</Window>

用户控件:

<UserControl x:Class="Mvvm.View.ControlPanelView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <TextBlock Grid.Row="0" TextAlignment="Right" Text="{Binding Total}" Margin="0,5,20,5" />
        <Button Grid.Row="1" Content="Test" Click="{Binding Path=OnClick}" Width="220" Height="100"/>
    </Grid>
</UserControl>

WPF, MVVM,以及嵌套用户控件的事件处理

您应该在按钮上使用Command,并在ViewModel中使用ICommand属性。

Click属性期望代码隐藏文件中的方法,该方法不能"绑定"到OnClick。因此,要么使用Command,要么只输入.xaml.cs文件中的方法名,该方法名将在单击按钮时调用。