c# wpf xaml binding command

c# - Enlace de comando No se puede convertir el objeto de tipo ''System.Reflection.RuntimeEventInfo'' para escribir ''System.Reflection.MethodInfo''



relay command wpf (2)

Cuando conecto mi botón a un comando a través de XAML, obtengo un error de tiempo de ejecución System.Windows.Markup.XamlParseException: Proporcionar valor en ''System.Windows.Data.Binding'' lanzó una excepción. ---> System.InvalidCastException: no se puede convertir el objeto de tipo ''System.Reflection.RuntimeEventInfo'' para escribir ''System.Reflection.MethodInfo''.

Cuando elimino el enlace de comando en XAML, todo funciona bien, y mis elementos se muestran, etc. Aquí está el enlace de comando:

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

Código para cablear el modelo de vista (en el código detrás de mi ventana):

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

Aquí está mi vista Modelo Mi vista modelo es el contexto de datos de mi vista

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

Aquí está mi 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>

Aquí está mi orden

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

También obtengo el siguiente error de tiempo de diseño (ver captura de pantalla) No se puede convertir el objeto de tipo ''System.Windows.Data.Binding'' para escribir ''Microsoft.Expression.Markup.DocumentModel.DocumentNode''.

Primer error de tiempo de ejecución - Ejecución de tiros

Los errores de tiempo de ejecución posteriores lanzan repetidamente: System.Windows.Markup.XamlParseException: Proporcione un valor en ''System.Windows.Data.Binding'' lanzó una excepción. ---> System.InvalidCastException: no se puede convertir el objeto de tipo ''System.Reflection.RuntimeEventInfo'' para escribir ''System.Reflection.MethodInfo''.

en MS.Internal.Helper.CheckCanReceiveMarkupExtension (MarkupExtension markupExtension, IServiceProvider serviceProvider, DependencyObject & targetDependencyObject, DependencyProperty & targetDependencyProperty)

en System.Windows.Data.BindingBase.ProvideValue (IServiceProvider serviceProvider)

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

--- Fin del rastro de la pila de excepción interna ---

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

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


¿Qué tal cambiar este XAML?

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

a esto:

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


No vincula un comando a la propiedad Click . La propiedad Click es para agregar un controlador de eventos tradicional al evento Click . Desea utilizar la propiedad Command para enlazar su comando.

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