Command binding Unable to cast object of type 'System.Reflection.RuntimeEventInfo' to type 'System.Reflection.MethodInfo'
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}" />
DermFrench
Coding in following: C# WPF MVVM XAML Webapi MVC Angular SQL Server VB.NET & VBA TDD
Updated on April 10, 2020Comments
-
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'.
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)
.......................
-
grek40 about 8 yearsIt just happend to me for the
CheckBox
... i was binding toChecked
instead ofIsChecked
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 over 7 yearsRepeat 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 almost 4 yearsAnd years later.
-
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 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 almost 2 yearsAhh, I see the XAML context might be attached, just have to teach my logging library about those properties.
-
Ben Voigt almost 2 yearsAnd I did all the work to print out those properties, and they're all empty :(