我的命令在我的 ViewModel 中。我需要传递嵌套了我的 Menuitem 的 DataGrid。这怎么可能 ?
<MenuItem Header="Delete item/s" Command="{Binding RemoveHistoryItem}" CommandParameter="{Binding ElementName=HistoryDataGrid}">
您绝对不应该将 UIElement 发送回您的 ViewModel(如 Jeffery 所述)。尝试将所需的 DataGrid 属性绑定到 ViewModel,然后在命令处理程序中访问它们。
我使用了一个按钮进行说明,但这同样适用于您的 MenuItem。
视图模型:
public class ViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
public ICommand RemoveHistoryItemCommand { get; private set; }
private HistoryItem _selectedHistoryItem;
public HistoryItem SelectedHistoryItem { get { return _selectedHistoryItem; } set { _selectedHistoryItem = value; OnPropertyChanged("SelectedHistoryItem"); } }
private ObservableCollection<HistoryItem> _historyItems = new ObservableCollection<HistoryItem>();
public ObservableCollection<HistoryItem> HistoryItems { get { return _historyItems; } set { _historyItems = value; OnPropertyChanged("HistoryItems"); } }
public ViewModel()
{
this.RemoveHistoryItemCommand = new ActionCommand(RemoveHistoryItem);
this.HistoryItems.Add(new HistoryItem() { Year = "1618", Description = "Start of war" });
this.HistoryItems.Add(new HistoryItem() { Year = "1648", Description = "End of war" });
}
// command handler
private void RemoveHistoryItem()
{
if (this.HistoryItems != null)
{
HistoryItems.Remove(this.SelectedHistoryItem);
}
}
}
public class HistoryItem
{
public string Year { get; set; }
public string Description { get; set; }
}
public class ActionCommand : ICommand
{
public event EventHandler CanExecuteChanged;
public Action _action;
public ActionCommand(Action action)
{
_action = action;
}
public bool CanExecute(object parameter) { return true; }
public void Execute(object parameter)
{
if (CanExecute(parameter))
_action();
}
}
xml:
<Window.DataContext>
<local:ViewModel />
</Window.DataContext>
<StackPanel>
<DataGrid ItemsSource="{Binding HistoryItems}" SelectedItem="{Binding SelectedHistoryItem, Mode=TwoWay}" />
<Button Content="Remove selected item" Command="{Binding RemoveHistoryItemCommand}" HorizontalAlignment="Left" />
</StackPanel>