如何通过 UserControl 模板中的函数删除 ListView 项?
How to delete a ListView Item by a function in UserControl Template?
我正在使用 C# 开发 windows 10 个通用应用程序。
我有一个 UserControl,它是 MyListview 项目模板。 Listview 将绑定数据。在用户控件中,有一个用于删除用户控件依赖属性内容(包含字符串文本、名称和整数 Id)的按钮。
列表视图显示对象的文本和删除它的按钮。
现在如何通过单击删除按钮从我的列表中删除该项目?
更新
我的数据class:
class Data
{
public int Id { get; set; }
public string Text { get; set; }
}
我的 usercontrol.cs :
public Data Content
{
get { return (Data)GetValue(ContentProperty); }
set { SetValue(ContentProperty, value); }
}
// Using a DependencyProperty as the backing store for Content. This enables animation, styling, binding, etc...
public static readonly DependencyProperty ContentProperty =
DependencyProperty.Register("Content", typeof(Data), typeof(MyUserControl1), new PropertyMetadata(null));
用户控件xaml:
<StackPanel>
<TextBlock x:Name="textBlock" Text="{Binding Content.Text, ElementName=textBlock}" />
<Button Click="Remove_Click"/>
</StackPanel>
我的列表实现:
<Page.Resources>
<DataTemplate x:Key="ListViewTemplate">
<local:MyUserControl1 Content="{Binding}"/>
</DataTemplate>
</Page.Resources>
<Grid>
<ListView x:Name="ListView" ItemTemplate="{StaticResource ListViewTemplate}" />
</Grid>
在页面后面的代码中,我使用 ObservableCollection<Data> items = new ObservableCollection<Data>();
将其设置为 Listview.ItemsSource
。
主要问题是如何从 MyUsercontrol1
中的 items
中删除该项目
您写了关于绑定的文章,所以我假设在您的 XAML 中有以下代码或类似代码:
<ListView ItemSource = "{Bind SomeCollection"} ... />
如果我是对的,那就没什么可做的了。如果 SomeCollection
是 ObservableCollection<T>
类型,从 SomeCollection
中删除一个项目就足够了,并且 UI 将刷新为“'automatically'”。总结:
- 将
SomeCollection
声明为 ObservableCollection<T>
。
- 在单击 删除 按钮时执行的命令中(或在事件处理程序中)只需调用
ObservableCollection<T>.Remove
.
更新
这段代码并不优雅,但表达了一个想法。首先我们需要修改 Data
class:
public class Data
{
public int Id { get; set; }
public string Text { get; set; }
public Action<Data> OnRemoveCallback { get; set; }
public void OnRemove()
{
OnRemoveCallback(this);
}
}
OnRemoveCallback
将用于通知 ListView
应该删除给定的数据元素。 Remove_click
MyUserControl
中的处理程序简单地执行 OnRemove
:
private void Remove_Click(object sender, RoutedEventArgs e)
{
Content.OnRemove();
}
最后,在您 Page
的代码中,我们必须定义一个逻辑,负责实际从列表中删除数据项:
public void Remove(Data d)
{
((ObservableCollection<Data>) ListView.ItemsSource).Remove(d);
}
...
ListView.ItemsSource = new ObservableCollection<Data>()
{
new Data() {Id = 1, Text = "1", OnRemoveCallback = Remove},
new Data() {Id = 2, Text = "2", OnRemoveCallback = Remove}
};
现在,只要按下 删除 按钮,您的主页就会收到通知,并且会执行一项操作。
正如我所说,这不是一个完美的解决方案。就个人而言,我将使用 MVVM 模式。谢谢 XAML 和 C# 将分开。
我正在使用 C# 开发 windows 10 个通用应用程序。 我有一个 UserControl,它是 MyListview 项目模板。 Listview 将绑定数据。在用户控件中,有一个用于删除用户控件依赖属性内容(包含字符串文本、名称和整数 Id)的按钮。
列表视图显示对象的文本和删除它的按钮。
现在如何通过单击删除按钮从我的列表中删除该项目?
更新
我的数据class:
class Data
{
public int Id { get; set; }
public string Text { get; set; }
}
我的 usercontrol.cs :
public Data Content
{
get { return (Data)GetValue(ContentProperty); }
set { SetValue(ContentProperty, value); }
}
// Using a DependencyProperty as the backing store for Content. This enables animation, styling, binding, etc...
public static readonly DependencyProperty ContentProperty =
DependencyProperty.Register("Content", typeof(Data), typeof(MyUserControl1), new PropertyMetadata(null));
用户控件xaml:
<StackPanel>
<TextBlock x:Name="textBlock" Text="{Binding Content.Text, ElementName=textBlock}" />
<Button Click="Remove_Click"/>
</StackPanel>
我的列表实现:
<Page.Resources>
<DataTemplate x:Key="ListViewTemplate">
<local:MyUserControl1 Content="{Binding}"/>
</DataTemplate>
</Page.Resources>
<Grid>
<ListView x:Name="ListView" ItemTemplate="{StaticResource ListViewTemplate}" />
</Grid>
在页面后面的代码中,我使用 ObservableCollection<Data> items = new ObservableCollection<Data>();
将其设置为 Listview.ItemsSource
。
主要问题是如何从 MyUsercontrol1
中的items
中删除该项目
您写了关于绑定的文章,所以我假设在您的 XAML 中有以下代码或类似代码:
<ListView ItemSource = "{Bind SomeCollection"} ... />
如果我是对的,那就没什么可做的了。如果 SomeCollection
是 ObservableCollection<T>
类型,从 SomeCollection
中删除一个项目就足够了,并且 UI 将刷新为“'automatically'”。总结:
- 将
SomeCollection
声明为ObservableCollection<T>
。 - 在单击 删除 按钮时执行的命令中(或在事件处理程序中)只需调用
ObservableCollection<T>.Remove
.
更新
这段代码并不优雅,但表达了一个想法。首先我们需要修改 Data
class:
public class Data
{
public int Id { get; set; }
public string Text { get; set; }
public Action<Data> OnRemoveCallback { get; set; }
public void OnRemove()
{
OnRemoveCallback(this);
}
}
OnRemoveCallback
将用于通知 ListView
应该删除给定的数据元素。 Remove_click
MyUserControl
中的处理程序简单地执行 OnRemove
:
private void Remove_Click(object sender, RoutedEventArgs e)
{
Content.OnRemove();
}
最后,在您 Page
的代码中,我们必须定义一个逻辑,负责实际从列表中删除数据项:
public void Remove(Data d)
{
((ObservableCollection<Data>) ListView.ItemsSource).Remove(d);
}
...
ListView.ItemsSource = new ObservableCollection<Data>()
{
new Data() {Id = 1, Text = "1", OnRemoveCallback = Remove},
new Data() {Id = 2, Text = "2", OnRemoveCallback = Remove}
};
现在,只要按下 删除 按钮,您的主页就会收到通知,并且会执行一项操作。
正如我所说,这不是一个完美的解决方案。就个人而言,我将使用 MVVM 模式。谢谢 XAML 和 C# 将分开。