0

我的命令在我的 ViewModel 中。我需要传递嵌套了我的 Menuitem 的 DataGrid。这怎么可能 ?

<MenuItem Header="Delete item/s" Command="{Binding RemoveHistoryItem}" CommandParameter="{Binding ElementName=HistoryDataGrid}">
4

1 回答 1

1

您绝对不应该将 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>
于 2013-03-10T20:57:21.563 回答