2013-05-15 69 views
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); 
    } 
} 
+0

'CommandParameter'是作爲參數傳遞給命令的參數,也就是'void UpdateIndexExecute(/ * this right here * /);'(我想有個'RelayCommand '?) – Default

+0

請注意,也是['ElementName'](http://msdn.microsoft.com/en-us/library/system.windows.data.binding.elementname.aspx)如果您不想使用ViewModel觸發更改風景。另一件要檢查的是['Triggers'](http://msdn.microsoft.com/en-us/library/ms745683.aspx) – Default

回答

1

在真正實現MVVM,你贏了」 t知道哪個RadioButton執行了該命令,因爲ViewModel不應該有關於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}"/> 

然後在您的視圖模型:

void UpdateIndexExecute(int index) 
{ 

} 

bool CanUpdateIndex(int index) 
{ 
    return true; 
} 

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

好的 - 我得到的視圖控件的邏輯只保留在視圖中,並且應該'讓它回到視圖模型,並且只有模型數據和類似數據才能使其恢復。謝謝! –

0

取而代之的結合該命令可以綁定內容,使用INotifyPropertyChanged接口來處理控件所做的更改。

相關問題