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

3

39

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)

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

Courageous answered 10/7, 2014 at 13:9 Comment(2)
Where and how have you set your DataContext? Where is your view model code (at least the property)? And for goodness sake, please delete that ridiculously long stack trace, unless you are intending on putting users off reading your question.Latreese
Hi, I've amended the question to show the datacontext being set.Courageous
V
85

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}" />
Vaticinate answered 10/7, 2014 at 13:50 Comment(7)
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 2016Priestcraft
And years later.Holstein
"... 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!"Heathcote
@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.Hypersensitize
Ahh, I see the XAML context might be attached, just have to teach my logging library about those properties.Hypersensitize
And I did all the work to print out those properties, and they're all empty :(Hypersensitize
@Priestcraft Eight years later and that comment still saved my day. Many thanks.Zamindar
T
14

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}" />
Teletypesetter answered 10/7, 2014 at 13:53 Comment(1)
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 :)Flashover
R
1

Got same error when used simple:

Loaded="{Binding LoadedCommand}"

instead of:

<i:Interaction.Triggers>
     <i:EventTrigger EventName="Loaded">
         <prism:InvokeCommandAction Command="{Binding LoadedCommand}" />
     </i:EventTrigger>
</i:Interaction.Triggers>
Roast answered 17/4, 2023 at 12:27 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.