如何确定哪个用户控件正在调用命令

时间:2013-05-15 14:23:43

标签: c# wpf mvvm

相对较新的MVVM - 我意识到这是一个简单的问题,但似乎无法找到答案。

我有4个分组的单选按钮,当选择一个按钮时,将显示其相关选项。我假设这4个单选按钮应该链接到相同的viewmodel命令,在这种情况下,该命令称为UpdateIndex

如何确定 哪个 单选按钮正在调用UpdateIndex,以便我可以采取适当的操作并显示相应的选项?

请注意,我的单选按钮命令绑定会正确调用UpdateIndexUpdateIndexExecute,我只是不知道如何确定调用它的单选按钮。我假设它与CommandParameter有关 - 但不确定如何从viewmodel访问它。

我的单选按钮示例:

<RadioButton
    Content="Option 1"
    GroupName="GroupHeader"
    Command="{Binding UpdateIndex}" />

单击时从单选按钮调用我的命令的代码片段...

void UpdateIndexExecute()
{

}

bool CanUpdateIndex()
{
   return true;
}

public ICommand UpdateIndex
{
    get
    {
        return new RelayCommand(UpdateTabIndexExecute, CanUpdateTabIndex);
    }
}

2 个答案:

答案 0 :(得分:1)

在真正的MVVM实现中,您将不知道哪个RadioButton执行了该命令,因为ViewModel不应该有关于View的任何信息。用户控件完全属于“仅存在于View中的东西,而不是ViewModel”的类别。您应该将一些有意义的内容传递给ViewModel。

您是正确的,有方法可以使用命令绑定的“CommandParameter”将信息传递到ICommand。为此,您将使用RelayCommand(RelayCommand)类的“通用”形式,其中“T”表示您作为参数传递的对象类型。

如果您只是尝试将索引作为参数传递,我想它看起来像这样:

<!-- We are passing index "1" as a parameter -->
<RadioButton Content="Option 1"  GroupName="GroupHeader" Command="{Binding UpdateIndex, CommandParameter=1}"/> 

然后在你的ViewModel中:

void UpdateIndexExecute(int index)
{

}

bool CanUpdateIndex(int index)
{
   return true;
}

public ICommand UpdateIndex { get { return new RelayCommand<int>(UpdateTabIndexExecute, CanUpdateTabIndex); } }

答案 1 :(得分:0)

您可以绑定内容,使用INotifyPropertyChanged接口处理控件所做的更改,而不是绑定命令。