Запуск RelayCommand из CodeBehind, связанного с виртуальной машиной

Интересно, могу ли я создать RelayCommand в моей ViewModel следующим образом:

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);
                }
}

На этом этапе я хотел бы отправить список обратно в ViewModel, используя эту RelayCommand, которую я создал ранее. Можно ли создать RelayCommand в коде, привязать его к команде ViewModel и запустить?

Какой альтернативный способ есть? Я мог бы, конечно, использовать класс Messenger со слабыми ссылками в MVVM-Light, но что-то мне не нравится, так это то, что он будет отправлять его всем подписчикам этого вызова, а не только базовой ViewModel (использование Messenger смертельно опасно, когда у вас есть несколько экземпляры одного и того же представления в TabControls)

Я надеюсь, что у кого-то есть идея поддержать меня, большое спасибо, Кейв.


person Houman    schedule 09.11.2010    source источник


Ответы (2)


Просто вызовите метод Execute команды после проверки результата CanExecute:

var viewModel = (MyViewModel)DataContext;
if (viewModel.MyCommand.CanExecute(list))
    viewModel.MyCommand.Execute(list);
person Thomas Levesque    schedule 09.11.2010

и если иногда DataContext элемента ui отличается от формы в целом, с чем я столкнулся, то можно сделать примерно так:

 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 UserControl, в котором существует подчиненный UserControl, а затем продолжите и сделайте забавные вещи, как указано в предыдущих ответах. В этом случае редактирование текстового поля в подчиненном пользовательском элементе управления должно было сообщить всеобъемлющей модели представления, что текст изменился.

Обратите внимание, что FindVisualParent взят отсюда https://stackoverflow.com/questions/636383/wpf-ways-to-find-controls

person AllenM    schedule 01.08.2011