问题是"如何使用XAML将VM触发的事件映射到命令?"
我是WPF和MVVM的新手。我真正想做的就是......
UI有一个按钮和一个网格控件。用户选择网格控件中的单个项目并按下按钮。根据在网格(A或B)中选择的项目类型,将显示两个不同模态对话框之一,以要求用户提供额外输入。当用户在对话框上单击“确定”时,将执行正确的命令。
我认为我应该这样做......
XAML将按钮绑定到命令。该命令查看当前选定的项目,并引发两个不同事件之一以指示所选项目的类型。在XAML中,这两个事件需要链接到命令。
这让我想到了上面提到的问题。如果我的VM触发两个不同的事件,我如何将每个事件绑定到XAML中的命令?
答案 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消息,并根据事件消息上的用户类型信息执行正确的命令。