在XAML中将VM事件绑定到命令

时间:2017-03-26 22:39:35

标签: wpf mvvm

问题是"如何使用XAML将VM触发的事件映射到命令?"

我是WPF和MVVM的新手。我真正想做的就是......

UI有一个按钮和一个网格控件。用户选择网格控件中的单个项目并按下按钮。根据在网格(A或B)中选择的项目类型,将显示两个不同模态对话框之一,以要求用户提供额外输入。当用户在对话框上单击“确定”时,将执行正确的命令。

我认为我应该这样做......

XAML将按钮绑定到命令。该命令查看当前选定的项目,并引发两个不同事件之一以指示所选项目的类型。在XAML中,这两个事件需要链接到命令。

这让我想到了上面提到的问题。如果我的VM触发两个不同的事件,我如何将每个事件绑定到XAML中的命令?

2 个答案:

答案 0 :(得分:2)

你好我为你创建了一个样本 - 你并没有真正提供任何示例代码所以我只是举一个例子

public class MyViewModel : BaseViewModel
{

    private object selectedItem;
    private ICommand myCommand;


    public ICommand MyCommand
    {
        get
        {
            if(myCommand == null)
            {
                myCommand = new RelayCommand(MyCommandMethod, CanIExecuteMyCommand);
            }

            return myCommand;
        }
    }


    public object SelectedItem
    {
        get
        {
            return selectedItem;
        }
        set
        {
            selectedItem = value;
            RaisePropertyChanged("SelectedItem");
            CommandManager.InvalidateRequerySuggested();
        }
    }

    private void MyCommandMethod()
    {
        if(SelectedItem is MyClassA)
        {
            // do A stuff
        }
        else if(SelectedItem is MyClassB)
        {
            // do B stuff
        }

        //Can this happen?
    }

    private bool CanIExecuteMyCommand()
    {
        return selectedItem != null;
    }

}

RelayCommand观看here

您要做的是将SelectedItem绑定到您的GridView。因此,您可以在ViewModel中对其进行验证。您谈到了验证 - 您可以通过向Condition CanIExecuteMyCommand() factory.setValidating(false); factory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); 提供一个Intent i = new Intent(this, ActivityTwo.class); startActivity(i); 来执行此操作。

您应该为MyClassA和MyClassB使用父类!它们应该是 - 因为您在同一个GridView中使用它们。否则请与对象交配。

答案 1 :(得分:0)

额外信息该命令所需的额外信息,因此您应该将其作为执行的延续 - 不需要事件。

相反,调用IDialogViewModel的OpenDialog(新的ExtraInfoViewModel(this-> model))。

当用户在对话框上单击“确定”时,将ExtraInfoViewModel中的UserUpdatedEvent发布到Mediator。现在您可以简单地将原始VM订阅UserUpdatedEvent消息,并根据事件消息上的用户类型信息执行正确的命令。