2

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

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

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

请注意,我的UpdateIndexUpdateIndexExecute确实从我的单选按钮命令绑定中正确调用,我只是不知道如何确定哪个单选按钮正在调用它。我认为它与CommandParameter- 但不确定如何从视图模型访问它。

我的单选按钮示例:

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

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

void UpdateIndexExecute()
{

}

bool CanUpdateIndex()
{
   return true;
}

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

2 回答 2

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); 
    } 
}
于 2013-05-15T14:27:10.523 回答
0

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

于 2013-05-15T14:51:44.117 回答