C# uwp gridview使用datatemplate中的按钮删除项

C# uwp gridview使用datatemplate中的按钮删除项,c#,xaml,gridview,mvvm,uwp-xaml,C#,Xaml,Gridview,Mvvm,Uwp Xaml,我在UWP应用程序中有一个gridview,并且我在数据模板中的每个gridview项目中都放置了一个按钮,这样它就可以用来从gridview中删除/移除该特定项目(将其从observableCollection后面移除)。我没有使用MVVM方法,因为我对它不太熟悉,我使用一个普通的可观察集合来绑定数据和数据模板 如果你能给我一个更好的建议,myabe使用MVVM,请建议我如何做提前感谢 代码: XAML网格视图(红色背景的按钮是我想用来删除项目的按钮) 代码隐藏 public Histor

我在UWP应用程序中有一个gridview,并且我在数据模板中的每个gridview项目中都放置了一个按钮,这样它就可以用来从gridview中删除/移除该特定项目(将其从observableCollection后面移除)。我没有使用MVVM方法,因为我对它不太熟悉,我使用一个普通的可观察集合来绑定数据和数据模板

如果你能给我一个更好的建议,myabe使用MVVM,请建议我如何做提前感谢

代码:

XAML网格视图(红色背景的按钮是我想用来删除项目的按钮)


代码隐藏

public History()
{
    this.InitializeComponent();
    HistoryVideos = new ObservableCollection<Video>();
}

public ObservableCollection<Video> HistoryVideos { get; private set; }
公共历史()
{
this.InitializeComponent();
HistoryVideos=新的ObservableCollection();
}
公共可观测收集历史视频{get;private set;}
我正在使用onnavigated to方法来填充集合,它工作得很好,而且我猜这在这里并不相关


我们可以将
命令
添加到
按钮
以在按下此按钮时调用,并且可以使用参数传递到命令属性

要使用该命令,我们应该能够定义继承自的
DelegateCommand

例如:

internal class DelegateCommand : ICommand
{
    private Action<object> execute;
    private Func<object, bool> canExecute;

    public DelegateCommand(Action<object> execute)
    {
        this.execute = execute;
        this.canExecute = (x) => { return true; };
    }

    public DelegateCommand(Action<object> execute, Func<object, bool> canExecute)
    {
        this.execute = execute;
        this.canExecute = canExecute;
    }

    public bool CanExecute(object parameter)
    {
        return canExecute(parameter);
    }

    public event EventHandler CanExecuteChanged;

    public void RaiseCanExecuteChanged()
    {
        if (CanExecuteChanged != null)
        {
            CanExecuteChanged(this, EventArgs.Empty);
        }
    }

    public void Execute(object parameter)
    {
        execute(parameter);
    }
}
XAML代码:

<GridView Name="MyGridView"  ItemsSource="{Binding Videos}">
    <GridView.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <TextBlock Text="{Binding Name}"></TextBlock>
                <Button  Background="Red"
                    HorizontalAlignment="Right" VerticalAlignment="Top"
                    Height="36" Canvas.ZIndex="1"
                Width="36"  Command="{Binding DataContext.DeleteCommand, ElementName=MyGridView}" CommandParameter="{Binding Id}">
                </Button>
            </StackPanel>
        </DataTemplate>
    </GridView.ItemTemplate>
</GridView>
更新:

<GridView Name="MyGridView"  ItemsSource="{x:Bind myViewModel.Videos}">
    <GridView.ItemTemplate>
        <DataTemplate x:DataType="local:Viedo">
            <StackPanel>
                <TextBlock Text="{x:Bind Name}"></TextBlock>
                <Button  Background="Red"
                    HorizontalAlignment="Right" VerticalAlignment="Top"
                    Height="36" Canvas.ZIndex="1"
                Width="36"  Command="{Binding DataContext.DeleteCommand, ElementName=MyGridView}" CommandParameter="{Binding Id}">
                </Button>
            </StackPanel>
        </DataTemplate>
    </GridView.ItemTemplate>
</GridView>


我可以问一下为什么我们要使用InotifyProeprty changed吗。一个可观察的收藏不是已经内置了这个功能吗?@touseef是的,你是对的,我已经更新了答案。
ObservableCollection
在添加、删除项目或刷新整个列表时提供通知。thnku看起来是个不错的答案。但我一直在研究,我想x:Bind也可以,它的性能更高。在这种情况下,我们也不需要ICommand实现?是这样吗?如果是这样的话,请您也建议这样的实施方式好吗?:)我的解决方案是使用MVVM方法,我们也可以使用x:bind。如果我们使用
命令
命令参数
,我们需要ICommand实现。由于视频类中不包含
DeleteCommand
,因此我们无法对
按钮的
命令
使用x:bind。如果要使用,应该能够在
视频
类中设置
删除命令
<GridView Name="MyGridView"  ItemsSource="{Binding Videos}">
    <GridView.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <TextBlock Text="{Binding Name}"></TextBlock>
                <Button  Background="Red"
                    HorizontalAlignment="Right" VerticalAlignment="Top"
                    Height="36" Canvas.ZIndex="1"
                Width="36"  Command="{Binding DataContext.DeleteCommand, ElementName=MyGridView}" CommandParameter="{Binding Id}">
                </Button>
            </StackPanel>
        </DataTemplate>
    </GridView.ItemTemplate>
</GridView>
private ViewModel myViewModel;

public MainPage()
{
    this.InitializeComponent();
    myViewModel = new ViewModel();
    MyGridView.DataContext = myViewModel;
}
<GridView Name="MyGridView"  ItemsSource="{x:Bind myViewModel.Videos}">
    <GridView.ItemTemplate>
        <DataTemplate x:DataType="local:Viedo">
            <StackPanel>
                <TextBlock Text="{x:Bind Name}"></TextBlock>
                <Button  Background="Red"
                    HorizontalAlignment="Right" VerticalAlignment="Top"
                    Height="36" Canvas.ZIndex="1"
                Width="36"  Command="{Binding DataContext.DeleteCommand, ElementName=MyGridView}" CommandParameter="{Binding Id}">
                </Button>
            </StackPanel>
        </DataTemplate>
    </GridView.ItemTemplate>
</GridView>