Dot-Net

從綁定到 VM 的 CodeBehind 觸發 RelayCommand

  • August 1, 2011

我想知道我是否可以像這樣在我的 ViewModel 上創建一個 RelayCommand:

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

導演:

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

從 XAML 背後的程式碼中,我從 DataGrid 中獲取選定的行並將它們放入列表中。

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

在這個階段,我想使用我之前創建的 RelayCommand 將 List 發送回 ViewModel。是否可以在程式碼中創建一個 RelayCommand 並將其綁定到 ViewModel 的命令並觸發它?

有什麼替代方法?我當然可以在 MVVM-Light 中使用弱引用的 Messenger 類,但我不喜歡它會將它發送給該呼叫的所有訂閱者,而不僅僅是底層的 ViewModel(當你有幾個時使用 Messenger 是致命的TabControls 中相同視圖的實例)

我希望有人有一個想法讓我繼續前進,非常感謝,Kave

Execute檢查結果後只需呼叫命令的方法CanExecute

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

如果有時 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);
   }

這將找到下屬 UserControl 所在的 UserControl 的 DataContext,然後繼續做一些有趣的事情,如前面的答案中所示。在這種情況下,編輯從屬使用者控制項上的文本框需要告訴總體視圖模型文本已更改。

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

引用自:https://stackoverflow.com/questions/4136776