如何通过 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"} ... />

如果我是对的,那就没什么可做的了。如果 SomeCollectionObservableCollection<T> 类型,从 SomeCollection 中删除一个项目就足够了,并且 UI 将刷新为“'automatically'”。总结:

  1. SomeCollection 声明为 ObservableCollection<T>
  2. 在单击 删除 按钮时执行的命令中(或在事件处理程序中)只需调用 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# 将分开。