使用MVVM的自定义WPF命令的问题

时间:2012-08-29 11:32:33

标签: wpf

我已经尝试了两种不同的方法,从ViewModel命令WPF,并且做得很短。如果我将它放入View中,那么top方法效果很好但是我被告知这是不好的做法。我被告知的第二种方法是在MVVM中进行自定义命令的正确方法,但是我仍然不知道如何从View中实际调用/绑定命令。

查看型号:

class MainViewModel : INotifyPropertyChanged
{

    #region INPC
    public event PropertyChangedEventHandler PropertyChanged;

    public void RaisePropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

    #endregion


     public readonly static RoutedUICommand myCommand;

    static MainViewModel()
    { 
        myCommand = new RoutedUICommand("customCommand","My Command",typeof(MainViewModel));

    }

    private void ExecutemyCommand(object sender, ExecutedRoutedEventArgs e)
    {

        MessageBox.Show("textBox1 cleared");
    }

    private void myCommandCanExecute(object sender, CanExecuteRoutedEventArgs e)
    {
        e.CanExecute = true;
    }
}

在我看来我有这个代码给我一个错误

<Window x:Class="ConfigManager2.View.MainView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:con="clr-namespace:ConfigManager2.Converters"
    xmlns:vm="clr-namespace:ConfigManager2.ViewModel"
    xmlns:local="clr-namespace:ConfigManager2.View"
.
.
.
<Window.CommandBindings>
    <CommandBinding
        Command="{x:Static vm:MainViewModel.myCommand}"
        CanExecute="myCommandCanExecute"
        Executed="ExecutemyCommand" />
</Window.CommandBindings>
.
.
.
 <Button Content="COMMAND ME" Height="50px"  Command="{x:Static vm:MainViewModel.myCommand}" />

我得到的错误是'ConfigManager2.View.MainView'不包含'ExecutemyCommand'的定义,并且没有可以找到接受类型'ConfigManager2.View.MainView'的第一个参数的扩展方法'ExecutemyCommand'(是你错过了使用指令或程序集引用?)

我尝试了另一种使用ICommand的方法,并且难以理解如何将其与XAML中的上述按钮绑定

视图模型:

    public ICommand ClearCommand { get; private set; }
public MainViewModel()
{
    ClearCommand= new ClearCommand(this);
}



class ClearCommand : ICommand
{
    private MainViewModel viewModel;

    public ClearCommand(MainViewModel viewModel)
    {
        this.viewModel = viewModel;
    }

    public bool CanExecute(object parameter)
    {
        return true;
    }

    public event EventHandler CanExecuteChanged;

    public void Execute(object parameter)
    {
        viewModel.vmTextBox1 = String.Empty;
        MessageBox.Show("Textbox1 Cleared");
    }
}

1 个答案:

答案 0 :(得分:1)

使用ICommand版本(我更喜欢),您可以直接绑定到命令:

<Button Command="{Binding ClearCommand}"/>

不需要Window.CommandBinding。如果将MainViewModel的实例设置为窗口或按钮DataContext,则此方法有效。