我想知道我是否可以像这样在我的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的实例)
我希望有人有个想法让我继续前进, 非常感谢, 卡瓦
答案 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