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

binding, c#, command, wpf, xaml

Solution

You don't bind a command to the `Click` property. The `Click` property is for adding a traditional event handler to the `Click` event. You want to use the `Command` property to bind your command.

<Button Content="{Binding BackgroundMessage}" 
        HorizontalAlignment="Left"  Width="75"  
        VerticalAlignment="Top" Height="Auto"  Margin="2" 
        Command="{Binding ElementName=MainGrid, 
                          Path=DataContext.AlertClickCommand}" 
        CommandParameter="{Binding}" />

Problem

When I wire up my button to a command via XAML, I'm getting a run time error System.Windows.Markup.XamlParseException: Provide value on 'System.Windows.Data.Binding' threw an exception. ---> System.InvalidCastException: Unable to cast object of type 'System.Reflection.RuntimeEventInfo' to type 'System.Reflection.MethodInfo'. When I remove the command binding in XAML everything works okay, and my items display etc.. Here is the command binding: ``` Click="{Binding ElementName=MainGrid, Path=DataContext.AlertClickCommand}" ``` Code to wire up view model (in code behind of my window): ``` this.AlertsView.DataContext = GlobalStuff.AlertManager1.AlertViewModel1; ``` Here is my view Model My view model is the data context of my view ``` using System.Collections.Generic; using System.ComponentModel; using Arkle.SharedUI.Model; using Arkle.SharedUI.ViewModel.Commands; namespace Arkle.SharedUI.ViewModel { public class AlertViewModel : INotifyPropertyChanged { private List<Alert> _alerts = new List<Alert>(); public List<Alert> Alerts { get { return _alerts; } set { _alerts = value; OnPropertyChanged("Alerts"); } } public AlertViewModel() { if (DesignerProperties.IsInDesignMode) { LoadDesignTimeData(); } } private void LoadDesignTimeData() { Alerts.Add(new Alert { BackgroundMessage = "Sis", IsAlerting = true, OverlayMessage = "3 mins", Tip = "Sis Data not received for 3 mins" }); Alerts.Add(new Alert { BackgroundMessage = "Bets", IsAlerting = true, OverlayMessage = "4", Tip = "4 unchecked danger bets" }); Alerts.Add(new Alert { BackgroundMessage = "Texts", IsAlerting = false, OverlayMessage = "3", Tip = "3 Unchecked Text Bets" }); } private AlertClickCommand _alertClickCommand; public AlertClickCommand AlertClickCommand { get { return _alertClickCommand ?? (_alertClickCommand = new AlertClickCommand(this)); } } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName) { PropertyChangedEventHandler handler = PropertyChanged; if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); } } } ``` Here is my xaml ``` <UserControl x:Class="Arkle.SharedUI.View.AlertsView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:viewModel="clr-namespace:Arkle.SharedUI.ViewModel" mc:Ignorable="d" d:DataContext="{d:DesignInstance Type=viewModel:AlertViewModel, IsDesignTimeCreatable=True}" x:Name="EarlyPriceEditorViewModelWindow" Height="Auto" Width="Auto"> <UserControl.Resources> <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/> </UserControl.Resources> <Grid Name="MainGrid"> <StackPanel Name="MainStackPanel"> <ListBox ItemsSource="{Binding Path=Alerts}" > <ListBox.ItemsPanel> <ItemsPanelTemplate> <WrapPanel Orientation="Horizontal" > </WrapPanel> </ItemsPanelTemplate> </ListBox.ItemsPanel> <ListBox.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal" Visibility="{Binding IsAlerting,Converter={StaticResource BooleanToVisibilityConverter}}"> <StackPanel Orientation="Horizontal"> <Button Content="{Binding BackgroundMessage}" HorizontalAlignment="Left" Width="75" VerticalAlignment="Top" Height="Auto" Margin="2" Click="{Binding ElementName=MainGrid, Path=DataContext.AlertClickCommand}" CommandParameter="{Binding}" /> <Label Content="{Binding OverlayMessage}" HorizontalAlignment="Left" Width="Auto" Margin="1,0,0,0" VerticalAlignment="Top" Background="Red" Foreground="White" FontWeight="Bold"> <Label.Style> <Style> <Style.Triggers> <DataTrigger Binding="{Binding IsAlerting}" Value="True"> <Setter Property="Image.Visibility" Value="Visible" /> <DataTrigger.EnterActions> <BeginStoryboard x:Name="ImageFlash"> <Storyboard> <DoubleAnimation Storyboard.TargetProperty="(UIElement.Opacity)" BeginTime="0:0:0" Duration="0:0:0.5" From="1.0" To="0.0" RepeatBehavior="Forever" AutoReverse="True"/> </Storyboard> </BeginStoryboard> </DataTrigger.EnterActions> <DataTrigger.ExitActions> <StopStoryboard BeginStoryboardName="ImageFlash" /> </DataTrigger.ExitActions> </DataTrigger> <DataTrigger Binding="{Binding IsAlerting}" Value="False"> <DataTrigger.Setters> <Setter Property="Image.Visibility" Value="Collapsed" /> </DataTrigger.Setters> </DataTrigger> </Style.Triggers> </Style> </Label.Style> </Label> <Label Content="|" Margin="5"/> </StackPanel> </StackPanel> </DataTemplate> </ListBox.ItemTemplate> </ListBox> </StackPanel> </Grid> </UserControl> ``` Here is my command ``` using System; using System.Windows.Input; using Arkle.Common; using Arkle.SharedUI.Events; using Arkle.SharedUI.Model; namespace Arkle.SharedUI.ViewModel.Commands { public class AlertClickCommand : ICommand { private AlertViewModel _alertViewModel; public AlertClickCommand(AlertViewModel alertViewModel) { _alertViewModel = alertViewModel; } public void Execute(object parameter) { if (parameter == null) { return; } var parameterAsAlert = (Alert)parameter; switch (parameterAsAlert.BackgroundMessage) { case "Bets": EventManager.Instance.GetEvent<ShowDangerBetsRequestedEvent>().Publish(null); break; default: return; } } public bool CanExecute(object parameter) { return true; } public event EventHandler CanExecuteChanged; } } ``` I also get the following design time error (see screenshot) Unable to cast object of type 'System.Windows.Data.Binding' to type 'Microsoft.Expression.Markup.DocumentModel.DocumentNode'. First Runtime Error - Throws Run Subsequent runtime errors throws repeatedly: System.Windows.Markup.XamlParseException: Provide value on 'System.Windows.Data.Binding' threw an exception. ---> System.InvalidCastException: Unable to cast object of type 'System.Reflection.RuntimeEventInfo' to type 'System.Reflection.MethodInfo'. at MS.Internal.Helper.CheckCanReceiveMarkupExtension(MarkupExtension markupExtension, IServiceProvider serviceProvider, DependencyObject& targetDependencyObject, DependencyProperty& targetDependencyProperty) at System.Windows.Data.BindingBase.ProvideValue(IServiceProvider serviceProvider) at MS.Internal.Xaml.Runtime.ClrObjectRuntime.CallProvideValue(MarkupExtension me, IServiceProvider serviceProvider) --- End of inner exception stack trace --- at System.Windows.FrameworkTemplate.LoadTemplateXaml(XamlReader templateReader, XamlObjectWriter currentWriter) .......................

Original source