从datagrid删除命令不起作用

时间:2012-06-20 11:58:59

标签: wpf mvvm wpfdatagrid

我使用数据模板按钮绑定一些记录,以删除WPF数据网格中所选行的记录。好吧,我的问题是删除命令不起作用。我真的不知道为什么它不工作,尽管把所有事情都做对了。请查看代码并告诉我我做错了什么。你的努力将使我的工作完成。 感谢

<Window x:Class="DemoMVVM.View.EmployeeDetails"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:viewModel="clr-namespace:DemoMVVM.ViewModel"
    Title="EmployeeDetails" Height="200" Width="500">
<Window.DataContext>
    <viewModel:EmployeeDetailsViewModel></viewModel:EmployeeDetailsViewModel>
</Window.DataContext>
<Grid>
    <DataGrid  AutoGenerateColumns="False" CanUserAddRows="False" ItemsSource="{Binding EmpDetailsList}" Grid.Column="0"  SelectedItem="{Binding SelectedRecord,Mode=TwoWay}" Margin="10,17,10,8" >

        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Path=Id}" IsReadOnly="True" Visibility="Collapsed" Width="90"></DataGridTextColumn>
            <DataGridTextColumn Header="Name" Binding="{Binding Path=Name}" IsReadOnly="True" Width="*"></DataGridTextColumn>
            <DataGridTextColumn Header="Age" Binding="{Binding Path=Age}"  IsReadOnly="True" Width="*"></DataGridTextColumn>
            <DataGridTextColumn Header="City" Binding="{Binding Path=City}"  IsReadOnly="True" Width="*"></DataGridTextColumn>            
            <DataGridTemplateColumn Header="Delete" Width="60" IsReadOnly="True">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Button Content="Delete" Command="{Binding Path=DeleteCommand}" ></Button>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>               
        </DataGrid.Columns>
    </DataGrid>
</Grid>

public class EmployeeDetailsViewModel
{
    private ObservableCollection<EmployeeModel> _empDetailsList;
    private EmployeeModel _selectedEmp;
    private RelayCommand _deleteCommand;

   public EmployeeDetailsViewModel()
   {
       _empDetailsList = new ObservableCollection<EmployeeModel>()
      {
          new EmployeeModel(){Id=1,Name="ABC",Age=26,City="Las Vegas"},
          new EmployeeModel(){Id=2,Name="MNO",Age=27,City="New Delhi"},
          new EmployeeModel(){Id=3,Name="XYZ",Age=25,City="Sydney"},
      };
   }

   public ObservableCollection<EmployeeModel> EmpDetailsList
   {
       get { return _empDetailsList; }
   }

   public ICommand DeleteCommand
   {
       get
       {
           if (_deleteCommand == null)
               _deleteCommand = new RelayCommand(Delete);
           return _deleteCommand;
       }
   }

   private void Delete()
   { 
   }
}

Relay Command Class`internal class RelayCommand:ICommand     {         #region Fields

    readonly Action _execute;
    readonly Func<bool> _canExecute;

    #endregion

    #region Constructors


    public RelayCommand(Action execute)
        : this(execute, null)
    {
    }

    public RelayCommand(Action execute, Func<bool> canExecute)
    {
        if (execute == null)
            throw new ArgumentNullException("execute");

        _execute = execute;
        _canExecute = canExecute;
    }

    #endregion // Constructors

    #region ICommand Members

    [DebuggerStepThrough]
    public bool CanExecute(object parameter)
    {
        return _canExecute == null ? true : _canExecute();
    }

    public event EventHandler CanExecuteChanged
    {
        add
        {
            if (_canExecute != null)
                CommandManager.RequerySuggested += value;
        }
        remove
        {
            if (_canExecute != null)
                CommandManager.RequerySuggested -= value;
        }
    }

    public void Execute(object parameter)
    {
        _execute();
    }

    #endregion // ICommand Members
}`

2 个答案:

答案 0 :(得分:3)

问题在于您使用的绑定意味着它期望DeleteCommand是EmployeeModel的属性而不是EmployeeDetailsViewModel。

也许以下内容可能有用(只是大纲) - 假设ListPresenter需要从列表中删除并知道要删除的项目:

public class EmployeeDetailsListPresenter : INotifyPropertyChanged
{
    _empDetailsList = new ObservableCollection<EmployeeDetailsPresenter>
        {
            new EmployeeDetailsPresenter(new EmployeeModel(...), Delete),
            ...
        };

    public IEnumerable<EmployeeDetailsPresenter> EmpDetailsList { ... }

    private void Delete(EmployeeDetailsPresenter employeeDetails)
    {
        _empDetailsList.Remove(employeeDetails);
    }
}

public class EmployeeDetailsPresenter : INotifyPropertyChanged
{
    public EmployeeDetailsPresenter(EmployeeModel employee,
                                    Action<EmployeeDetailsPresenter> delete)
    {
        _employee = employee;
        _delete = delete;
    }

    public ICommand DeleteCommand
    {
        get
        {
            return new RelayCommand(() => _delete(this))
        }
    }
}

答案 1 :(得分:0)

您可以使用下面的代码来解决您在xaml中的错误...我刚刚在您的xaml中做了一些小改动来解决这个问题。

                                

        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Path=Id}" IsReadOnly="True" Visibility="Collapsed" Width="90"></DataGridTextColumn>
            <DataGridTextColumn Header="Name" Binding="{Binding Path=Name}" IsReadOnly="True" Width="*"></DataGridTextColumn>
            <DataGridTextColumn Header="Age" Binding="{Binding Path=Age}"  IsReadOnly="True" Width="*"></DataGridTextColumn>
            <DataGridTextColumn Header="City" Binding="{Binding Path=City}"  IsReadOnly="True" Width="*"></DataGridTextColumn>            
            <DataGridTemplateColumn Header="Delete" Width="60" IsReadOnly="True">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Button Content="Delete" Command="{Binding Path=DataContext.DeleteCommand}" ></Button>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>               
        </DataGrid.Columns>
    </DataGrid>
</Grid>