【问题标题】:How to delete from DataGrid in WPF?如何从 WPF 中的 DataGrid 中删除?
【发布时间】:2021-10-05 07:17:16
【问题描述】:

我已经尝试了 Stackoverflow 上的几乎所有解决方案我不明白为什么我在 datagrid 中的按钮绑定语句没有对 ViewModel 中的属性产生影响。 这是我的数据网格:

 <DataGridTemplateColumn Header="Delete">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <Button Command="{Binding DataContext.DeleteButton, RelativeSource={RelativeSource AncestorType=UserControl}}">Delete</Button>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>

这是我在 VeiwModel 中的代码:

private ICommand _delete;

        public ICommand DeleteButton
        {
            get
            {
                if (_delete == null)
                {
                    _delete = new UserCommand(DeleteItemExecute, CanDeleteItemExecute);
                }
                return _delete;
            }
        }

【问题讨论】:

  • 你试过
  • 它说库中缺少 AncestorType
  • 这解决了错误,但它是正确的方法吗?我的意思是解决了“缺少库”错误而不是实际错误。
  • 它不工作
  • 我不是 WPF 专家。让专家评论:)

标签: c# wpf xaml


【解决方案1】:

我做同样的事情,但用另一种方式:

查看代码:

<Button Click="DeleteObject">
    <Image Source="../img/image_delete.png" Width="20" Height="20"/>
</Button>

然后在我的模型上:

private void DeleteObject(object sender, RoutedEventArgs e)
{
    Button button = sender as Button;
    Object selectedObject = button.DataContext as Object;
}

【讨论】:

  • 谢谢!但我相信这不是 MVVM 方法。
  • @Psychonaut007 好吧,我想我还有很多东西要学...
【解决方案2】:

在我的参考资料中添加了“姓名”

<Page x:Class="InventoryManagementWPF.Views.InventoryPage"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:InventoryManagementWPF.Views"
      xmlns:viewmodel ="clr-namespace:InventoryManagementWPF.ViewModel"
      mc:Ignorable="d" 
      d:DesignHeight="450" d:DesignWidth="800"
      Title="InventoryPage"
  ------>    x:Name="_window">  <------------- Added this change only
<Button Command="{Binding DataContext.DeleteButton, ElementName=_window}" CommandParameter ="{Binding}">Delete</Button>

否则一切都是一样的。这对我有用。我找到了解决方案here

【讨论】:

    【解决方案3】:

    您可以在不指定连接器名称的情况下执行以下操作。您可以找到有关使用RelativeSourcehere的详细信息。

    Xaml 代码

       <DataGrid ItemsSource="{Binding DataItemCollection}" AutoGenerateColumns="False" CanUserAddRows="False">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Item - 1" Binding="{Binding Item1}"/>
                <DataGridTextColumn Header="Item - 2" Binding="{Binding Item2}"/>
                <DataGridTextColumn Header="Item - 3" Binding="{Binding Item3}"/>
                <DataGridTemplateColumn Header="Delete">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Button Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=DataContext.DeleteCommand}">Delete</Button>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>
    

    ViewModeCode

    class MainWindowViewModel
        {
            public RelayCommand DeleteCommand { get; set; }
    
    
            private ObservableCollection<DataItem> _dataItemCollection = new ObservableCollection<DataItem>();
            public ObservableCollection<DataItem> DataItemCollection
            {
                get { return _dataItemCollection; }
                set { _dataItemCollection = value; }
            }
    
            public MainWindowViewModel()
            {
                DataItemCollection.Add(new DataItem { Item1 = "Item - 1", Item2 = "Item - 2", Item3 = "Item - 3" });
    
    
                DeleteCommand = new RelayCommand(Delete);
            }
    
            void Delete(object param)
            {
                Console.WriteLine("Delete Click");
            }
        }
    

    中继命令

    public class RelayCommand : ICommand
    {
        #region Fields
        readonly Action<object> _execute;
        readonly Predicate<object> _canExecute;
    
        #endregion
    
        #region Constructors
        public RelayCommand(Action<object> execute) : this(execute, null) { }
    
        public RelayCommand(Action<object> execute, Predicate<object> canExecute)
        {
            if (execute == null)
                throw new ArgumentNullException("execute");
    
            _execute = execute;
            _canExecute = canExecute;
        }
        #endregion
    
        #region ICommand Members
        public bool CanExecute(object parameter)
        {
            return _canExecute == null ? true : _canExecute(parameter);
        }
    
        public event EventHandler CanExecuteChanged
        {
            add { CommandManager.RequerySuggested += value; }
            remove { CommandManager.RequerySuggested -= value; }
        }
    
        public void Execute(object parameter)
        {
            _execute(parameter);
        }
        #endregion
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-17
      • 2019-02-01
      • 1970-01-01
      • 2014-08-22
      • 2019-10-26
      • 2011-09-17
      • 1970-01-01
      相关资源
      最近更新 更多