本文介绍了RelayCommand与参数抛MethodAccessException的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我创建使用.NET和MVVM轻应用,我有一些麻烦RelayCommands。

I am creating an application using .Net and MVVM Light and I am having some trouble for RelayCommands.

我试图创建一个RelayCommand它接受一个参数,并将其传递到同一视图模型中的功能。但是每次我尝试做这个,我不断收到以下异常:

I'm trying to create a RelayCommand which takes in a single argument and passes it to a function within the same ViewModel. However everytime I try and do this I keep getting the following exception:

有一个第一次机会异常类型的System.MethodAccessException  出现在mscorlib.dll

我的code是如下。

XAML

<TextBlock Style="{StaticResource QueryFormTab}" >
    <Hyperlink Command="{Binding TestCommand}" CommandParameter="Tester">
        Test
    </Hyperlink>
</TextBlock>

视图模型

public RelayCommand<string> TestCommand { get; private set; }

// in the constructor
TestCommand = new RelayCommand<string>((param) => _testExecute(param));

// function in viewmodel
private void _testExecute(string s)
{
    Trace.WriteLine("Test");
    ViewModelVariable = "abc";
}

如果我做的函数_testExecute静态它的工作原理但是我无法访问任何其他功能我的视图模型中。

If I make the function _testExecute static it works however I am unable to access any of the other functions within my viewmodel.

我一直在试图找出了这一点,而现在却没有任何运气。

I have been trying to figure this out for a while now but not had any luck.

推荐答案

我不知道你的RelayCommand类的样子,但我得到了你使用这些类的架构工作。

I don't know what your RelayCommand Class looks like, But i got yours to work using these class architectures.

RelayCommand类:

#region Referenceing

using System;
using System.Diagnostics;
using System.Windows.Input;

#endregion

public class RelayCommand : ICommand
{
    #region Fields

    private readonly Action<object> _execute;
    private readonly Predicate<object> _canExecute;

    #endregion // Fields

    #region Constructors

    public RelayCommand(Action<object> execute) : this(execute, null)
    {
    }

    public RelayCommand(Action<object> execute, Predicate<object> canExecute)
    {
        if (execute == null)
            throw new ArgumentNullException("execute");
        _execute = execute;
        _canExecute = canExecute;
    }

    #endregion // Constructors

    #region ICommand Members

    [DebuggerStepThrough]
    public bool CanExecute(object parameter)
    {
        return _canExecute == null || _canExecute(parameter);
    }

    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }

    public void Execute(object parameter)
    {
        _execute(parameter);
    }

    #endregion // ICommand Members
}

XAML:

<Window x:Class="StackTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:this="clr-namespace:StackTest"
        Title="MainWindow" Height="350" Width="525">
  <Window.DataContext>
    <this:ViewModel/>
  </Window.DataContext>
    <Grid>
    <TextBlock>
    <Hyperlink Command="{Binding TestCommand}" CommandParameter="Tester">
        Test
    </Hyperlink>
    </TextBlock>
  </Grid>
</Window>

XAML.cs:

public partial class MainWindow
{
    public MainWindow()
    {
        InitializeComponent();
    }
}

ViewModel.cs:

public class ViewModel
{
    private ICommand _testCommand;

    public ICommand TestCommand
    {
        get { return _testCommand ?? (_testCommand = new RelayCommand(_testExecute)); }
    }

    private void _testExecute(object s)
    {
        Trace.WriteLine(s + "Worked!!");
    }
}

输出:的TesterWorked !!

Output: TesterWorked!!

这篇关于RelayCommand与参数抛MethodAccessException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-30 20:08