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

27,551

Solution 1

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}" />

Solution 2

How about change this XAML:

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

to this:

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

DermFrench

Coding in following: C# WPF MVVM XAML Webapi MVC Angular SQL Server VB.NET &amp; VBA TDD

Updated on April 10, 2020

Comments

  • DermFrench
    DermFrench about 4 years

    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'.

    enter image description here

    First Runtime Error - Throws Run enter image description here

    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)

    .......................

  • grek40
    grek40 about 8 years
    It just happend to me for the CheckBox... i was binding to Checked instead of IsChecked and looked around somewhere else for the problem until I had a closer look at the exception, turned to google and landed here :) still useful in 2016
  • vapcguy
    vapcguy over 7 years
    Repeat of the first answer - but I saw it was posted only 3 mins after the other one, so likely you were in the process of posting when the other guy beat you to it, and so I won't downvote, but upvote, instead :)
  • jeromej
    jeromej almost 4 years
    And years later.
  • marcolino
    marcolino over 3 years
    "... that is how the legend of the comment that should have been an answer began - and his story was told for many many years. And bards in taverns sang songs about it and all those who listen to them would raise their coffee mugs and shout UPVOTE! UPVOTE! UPVOTE!"
  • Ben Voigt
    Ben Voigt almost 2 years
    @grek40: Thank you so much, I just made the exact same mistake. These WPF exceptions are even worse than DLL Hell. Everyone considering using declarative DSL, whether it be UI like WPF does or anything else, needs to consider that the context is data instead of meaningful function names on the stack trace, and therefore every exception needs to be given a "data stack trace" of sorts. That is not a "feature request", that is the absolute minimum functionality required for anyone implementing a DSL.
  • Ben Voigt
    Ben Voigt almost 2 years
    Ahh, I see the XAML context might be attached, just have to teach my logging library about those properties.
  • Ben Voigt
    Ben Voigt almost 2 years
    And I did all the work to print out those properties, and they're all empty :(