从Code Behind中绑定到VM的RelayCommand

时间:2010-11-09 17:47:17

标签: .net wpf mvvm mvvm-light relaycommand

我想知道我是否可以像这样在我的ViewModel上创建一个RelayCommand:

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将List发送回ViewModel。是否可以在代码中创建一个RelayCommand并将其绑定到ViewModel的命令并将其关闭?

有什么替代方式?我当然可以在MVVM-Light中使用弱引用的Messenger类,但是我不喜欢的是它会将它发送给该调用的所有订阅者,而不仅仅是底层的ViewModel(当你有几个时它会致命地使用Messenger) TabControls中相同View的实例)

我希望有人有个想法让我继续前进, 非常感谢, 卡瓦

2 个答案:

答案 0 :(得分:17)

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

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

答案 1 :(得分: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