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