2

我将一些记录与数据模板按钮绑定,用于删除 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()
   { 
   }
}

中继命令类`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
}`
4

2 回答 2

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))
        }
    }
}
于 2012-06-20T12:02:09.213 回答
1

您可以使用下面的代码来简单地解决您在 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>

于 2012-06-20T13:53:17.053 回答