2014-07-10 4 views
16

einzugeben Wenn ich meine Schaltfläche zu einem Befehl über XAML verdrahte, erhalte ich einen Laufzeitfehler System. Windows.Markup.XamlParseException: Geben Sie Wert für 'System.Windows.Data.Binding' eine Ausnahme ausgelöst. ---> System.InvalidCastException: Kann Objekt des Typs 'System.Reflection.RuntimeEventInfo' nicht in den Typ 'System.Reflection.MethodInfo' umwandeln.Command-Bindung Kann Objekt des Typs 'System.Reflection.RuntimeEventInfo' nicht umwandeln, um 'System.Reflection.MethodInfo'

Wenn ich den Befehl entfernen in XAML aller Bindung funktioniert gut, und meine Artikel anzeigen etc .. ist die Befehlsbindung:

Click="{Binding ElementName=MainGrid, Path=DataContext.AlertClickCommand}" 

Codeansicht Modell verdrahten (in Code hinter meinem Fenster):

this.AlertsView.DataContext = GlobalStuff.AlertManager1.AlertViewModel1; 

Hier Meine Ansicht Modell

der Datenkontext meiner Ansicht ist meiner Ansicht nach Modell ist

Hier ist meine 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> 

Hier ist mein Befehl

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; 
    } 
} 
ist

ich auch die folgenden Designzeitfehler kann nicht werfen Objekt vom Typ (siehe Screenshot) ' System.Windows.Data.Binding 'zum Eingeben von' Microsoft.Expression.Markup.DocumentModel.DocumentNode '.

enter image description here

Erste Runtime Error - Führen Wirft enter image description here

Folgefehler Laufzeit wiederholt Würfen: System.Windows.Markup.XamlParseException: Geben Sie Wert auf ‚System.Windows.Data. Binding "hat eine Ausnahme gemacht. ---> System.InvalidCastException: Kann Objekt des Typs 'System.Reflection.RuntimeEventInfo' nicht in den Typ 'System.Reflection.MethodInfo' umwandeln.

bei MS.Internal.Helper.CheckCanReceiveMarkupExtension (Markupextension Markupextension, IServiceProvider serviceprovider, DependencyObject & targetDependencyObject, DependencyProperty & targetDependencyProperty)

bei System.Windows.Data.BindingBase.ProvideValue (IServiceProvider serviceprovider)

bei MS.Internal.Xaml.Runtime.ClrObjectRuntime.CallProvideValue (MarkupExtension me, IServiceProvider serviceProvider)

--- Ende der inneren Ausnahme Stack-Trace ---

bei System.Windows.FrameworkTemplate.LoadTemplateXaml (XamlReader templateReader, XamlObjectWriter currentWriter)

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

+0

Wo und wie haben Sie setzen Ihre 'DataContext'? Wo ist Ihr Modellcode (zumindest die Eigenschaft)? Und um Gottes Willen, bitte löschen Sie diesen lächerlich langen Stack-Trace, es sei denn, Sie möchten die Benutzer davon abhalten, Ihre Frage zu lesen. – Sheridan

+0

Hallo, ich habe die Frage so geändert, dass der eingestellte Datenkontext angezeigt wird. – DermFrench

Antwort

30

Sie binden einen Befehl nicht an die Eigenschaft Click.Die Eigenschaft Click dient zum Hinzufügen eines herkömmlichen Ereignishandlers zum Click-Ereignis. Sie möchten die Eigenschaft Command verwenden, um Ihren Befehl zu binden.

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

Danke, ich bin ein Idiot !!! – DermFrench

+16

Es ist mir nur passiert für die 'CheckBox' ... ich war verbindlich an' Checked' anstelle von 'IsChecked' und schaute mich woanders um, bis ich mir die Ausnahme genauer angesehen habe, googeln und hier gelandet bin :) * noch nützlich in 2016 * – grek40

7

Wie wäre Änderung dieser XAML:

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

dazu:

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

Wiederholen Sie die erste Antwort - aber ich sah es wurde nur 3 Minuten nach dem anderen, so wahrscheinlich, Sie waren im Begriff der Veröffentlichung, wenn der andere Kerl Sie dazu schlagen, und so ich wird nicht downvote, sondern upvote, stattdessen :) – vapcguy

Verwandte Themen