根据列表视图选择的项目从列表中删除项目
Remove item from list based on listview selected item
我知道这听起来有点基础,但我卡住了,我不确定如何继续。
这是主要的 Class:
public sealed partial class MainPage : Page
{
private ObservableCollection<MyClass> MyList = new ObservableCollection<MyClass>();
private void Button_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
MyList.Add(new MyClass("Hello", "World"));
MyListview.Items.Add(new MyClass("Hello", "World"));
}
private void Delete_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
MyList.Remove((MyClass)MyListview.SelectedItem);
}
}
我有一个列表名称 MyList
和一个列表视图名称 MyListview
。我想要的是,当我按下一个按钮时,从 MyList 项目中删除 MyListview 的选定项目。所以像这样:
MyList.Remove((MyClass)MyListview.SelectedItem);
但出于某种原因,这对我不起作用。这样就不会删除任何内容。
我主页的XAML:
<Page
x:Class="App17.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:App17"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Button x:Name="Delete" Content="Delete" HorizontalAlignment="Left" Height="116" Margin="140,89,0,0" VerticalAlignment="Top" Width="224" Click="Delete_Click"/>
<Button Content="Button" HorizontalAlignment="Left" Height="116" Margin="442,89,0,0" VerticalAlignment="Top" Width="214" Click="Button_Click"/>
<ListView x:Name="MyListview" HorizontalAlignment="Left" Height="497" Margin="143,261,0,0" VerticalAlignment="Top" Width="510"/>
</Grid>
</Page>
而我的 class MyClass
是:
class MyClass
{
public string Title { get; set; }
public string Name { get; set; }
public MyClass(string title,string name)
{
Title = title;
Name = name;
}
}
我在确保我真的在测试您真正需要帮助的代码时遇到了一些麻烦。但我想我已经看得够多了,可以理解你遇到的问题是什么。
具体来说:您在显示项目的 ListView
和存储项目的私人 MyList
collection 之间没有任何联系。
在 XAML-based 应用程序中,重点是通过绑定将您的数据连接到可视化表示。 ObservableCollection<T>
存在的一个主要原因是为了促进这一点,允许 collection-based 视觉效果对 collection 中的变化做出反应。
在您的示例中,您应该进行以下更改...
更改 MainPage
使其构造函数和 Button_Click()
方法如下所示:
public MainPage()
{
this.InitializeComponent();
DataContext = MyList;
}
private ObservableCollection<MyClass> MyList = new ObservableCollection<MyClass>();
private void Button_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
MyList.Add(new MyClass("Hello", "World"));
}
以上删除了对 MyListview.Items.Add()
的无关调用(当数据正确绑定时不需要)并将您的 MyList
collection 分配为页面的 DataContext
, 使其可用于绑定目的。
然后更改 XAML,使 ListView
声明如下所示:
<ListView x:Name="MyListview"
HorizontalAlignment="Left" VerticalAlignment="Top"
Height="497" Width="510"
Margin="143,261,0,0"
ItemsSource="{Binding}"/>
这里的关键是 ItemsSource
属性。使用空 Binding
,控件将使用当前数据上下文,此处将从页面 object 继承,您在代码中将其设置为 MyList
.
这样,您只需要对MyList
本身进行操作,视觉表现会自动更新。
我知道这听起来有点基础,但我卡住了,我不确定如何继续。
这是主要的 Class:
public sealed partial class MainPage : Page
{
private ObservableCollection<MyClass> MyList = new ObservableCollection<MyClass>();
private void Button_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
MyList.Add(new MyClass("Hello", "World"));
MyListview.Items.Add(new MyClass("Hello", "World"));
}
private void Delete_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
MyList.Remove((MyClass)MyListview.SelectedItem);
}
}
我有一个列表名称 MyList
和一个列表视图名称 MyListview
。我想要的是,当我按下一个按钮时,从 MyList 项目中删除 MyListview 的选定项目。所以像这样:
MyList.Remove((MyClass)MyListview.SelectedItem);
但出于某种原因,这对我不起作用。这样就不会删除任何内容。
我主页的XAML:
<Page
x:Class="App17.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:App17"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Button x:Name="Delete" Content="Delete" HorizontalAlignment="Left" Height="116" Margin="140,89,0,0" VerticalAlignment="Top" Width="224" Click="Delete_Click"/>
<Button Content="Button" HorizontalAlignment="Left" Height="116" Margin="442,89,0,0" VerticalAlignment="Top" Width="214" Click="Button_Click"/>
<ListView x:Name="MyListview" HorizontalAlignment="Left" Height="497" Margin="143,261,0,0" VerticalAlignment="Top" Width="510"/>
</Grid>
</Page>
而我的 class MyClass
是:
class MyClass
{
public string Title { get; set; }
public string Name { get; set; }
public MyClass(string title,string name)
{
Title = title;
Name = name;
}
}
我在确保我真的在测试您真正需要帮助的代码时遇到了一些麻烦。但我想我已经看得够多了,可以理解你遇到的问题是什么。
具体来说:您在显示项目的 ListView
和存储项目的私人 MyList
collection 之间没有任何联系。
在 XAML-based 应用程序中,重点是通过绑定将您的数据连接到可视化表示。 ObservableCollection<T>
存在的一个主要原因是为了促进这一点,允许 collection-based 视觉效果对 collection 中的变化做出反应。
在您的示例中,您应该进行以下更改...
更改 MainPage
使其构造函数和 Button_Click()
方法如下所示:
public MainPage()
{
this.InitializeComponent();
DataContext = MyList;
}
private ObservableCollection<MyClass> MyList = new ObservableCollection<MyClass>();
private void Button_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
MyList.Add(new MyClass("Hello", "World"));
}
以上删除了对 MyListview.Items.Add()
的无关调用(当数据正确绑定时不需要)并将您的 MyList
collection 分配为页面的 DataContext
, 使其可用于绑定目的。
然后更改 XAML,使 ListView
声明如下所示:
<ListView x:Name="MyListview"
HorizontalAlignment="Left" VerticalAlignment="Top"
Height="497" Width="510"
Margin="143,261,0,0"
ItemsSource="{Binding}"/>
这里的关键是 ItemsSource
属性。使用空 Binding
,控件将使用当前数据上下文,此处将从页面 object 继承,您在代码中将其设置为 MyList
.
这样,您只需要对MyList
本身进行操作,视觉表现会自动更新。