2010-11-09 16 views
8

我不知道是否能創建這樣對我的ViewModel一個RelayCommand:擊發代碼隱藏RelayCommand勢必VM

public RelayCommand<IList<VectorViewModel>> MyCommand { get; set; } 

構造函數:

MyCommand = new RelayCommand<IList<VectorViewModel>>(DoSomething); 

從後面的XAML代碼中,我得到的從DataGrid中選擇行並將它們放入List中。

if (xamDatagridVector.SelectedItems.Records.Count >= 3) 
{ 
       var list = new List<VectorViewModel>(); 
       foreach (DataRecord record in xamDatagridVector.SelectedItems.Records) 
       { 
        list.Add((VectorViewModel)record.DataItem); 
       } 
} 

在這個階段,我想通過使用之前創建的RelayCommand將列表發送回ViewModel。這將有可能在代碼中創建一個RelayCommand,並將其綁定到ViewModel的命令並將其關閉?

還有什麼替代方法?我當然可以在MVVM-Light中使用弱引用的Messenger類,但是我不喜歡那裏的東西,它會將它發送給該調用的所有訂閱者,而不僅僅是底層的ViewModel(它在使用Messenger時致命內的TabControls相同視圖)的情況下,

我希望有人有一個主意,讓我去, 非常感謝, 卡瓦

回答

14

只需調用命令的Execute方法檢查CanExecute後的結果:

var viewModel = (MyViewModel)DataContext; 
if (viewModel.MyCommand.CanExecute(list)) 
    viewModel.MyCommand.Execute(list); 
0

a第二,如果有時一個UI元素的DataContext的從形式作爲一個整體的區別,我遇到過,那麼你可以做這樣的事情:

private void TextBoxTextChanged(object sender, TextChangedEventArgs e) 
    { 
     var binding = ((TextBox)sender).GetBindingExpression(TextBox.TextProperty); 
     binding.UpdateSource(); 

     var msg = String.Format("Migrator file selection updated to {0}", ((TextBox)sender).Text); 
     var rowControl = UiHelpers.FindVisualParent<UserControl>((DependencyObject)sender); // get the  FileNameSettingsRow UserControl 
     var form = UiHelpers.FindVisualParent<UserControl>((DependencyObject)rowControl); // get the main form it is used on 

     var viewModel = (UseCaseSettingsViewModel)form.DataContext; 

     if (viewModel.UpdateFileInCollectionCommand.CanExecute(((TextBox)sender).Text)) 
      viewModel.UpdateFileInCollectionCommand.Execute(((TextBox)sender).Text); 


     Messenger.Default.Send(new NotificationMessage(this, msg), Notifications.AppendSysMessageTextToken); 

     // Tell the UseCaseSettingsViewModel to force an update and reload 
     //Messenger.Default.Send(new NotificationMessage(this, ((TextBox)sender).Text), Notifications.FileSelectionChangedInternalToken); 
    } 

將發現在其上下級用戶控件中存在用戶控件的DataContext的,然後繼續做前面的答案中指出的有趣的事情。在這種情況下,編輯下級用戶控件上的文本框,以告訴整體視圖模型文本已更改。

請注意,FindVisualParent來自這裏>>> https://stackoverflow.com/questions/636383/wpf-ways-to-find-controls