我使用数据模板按钮绑定一些记录,以删除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
}`
答案 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>