8

我想知道我是否可以像这样在我的 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

4

2 回答 2

19

Execute检查结果后只需调用命令的方法CanExecute

var viewModel = (MyViewModel)DataContext;
if (viewModel.MyCommand.CanExecute(list))
    viewModel.MyCommand.Execute(list);
于 2010-11-09T18:21:48.077 回答
0

如果有时 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

于 2011-08-01T05:57:53.843 回答