-1

我正在用c#开发windows 10通用应用程序。 我有一个UserControl是MyListview项目模板。 Listview将绑定数据。在userControl中,有一个用于删除usercontrol DependencyProperty Content(包含字符串Text,Name和int Id)的按钮。如何通过UserControl模板中的函数删除ListView项目?

Listview显示对象的文本和删除它的按钮。

现在如何通过单击删除按钮从我的列表中删除该项目?

更新

我的数据类:

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> 

,并在代码behinde页我用一个ObservableCollection<Data> items = new ObservableCollection<Data>();设置Listview.ItemsSource它。

的主要问题是如何从items删除MyUsercontrol1

+0

所以你不要如何实现Remove_Click,你呢? –

+0

@MichałKomorowski是的,我想按删除按钮和项目从列表中删除 –

回答

1

该项目你写的绑定,所以我假设你的XAML是有下面的代码或类似:

<ListView ItemSource = "{Bind SomeCollection"} ... /> 

如果我是对的,那就没有什么可做的了。如果SomeCollection的类型为ObservableCollection<T>,那么从SomeCollection中删除一个项目就足够了,UI将自动刷新。总结:

  1. 声明SomeCollectionObservableCollection<T>
  2. 在当点击删除按钮(或在事件处理程序)时执行的命令简单地调用ObservableCollection<T>.Remove

UPDATE

此代码是不优雅,但显示了一个主意。首先,我们需要修改Data类:

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_clickMyUserControl处理程序仅执行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#将分离。

+0

我使用的ObservableCollection 但主要问题是如何从MyUserControle删除。 –

+0

@AliMalek你需要从集合,而不是用户控件本身删除的数据项。如果您删除该项目,UserControl将被列表中删除。 –

+0

但它正在从的ObservableCollection 集合中删除。现在,我不明白你想达到什么。 –