如何删除ListView中的所有项目,当它绑定到ObjectDataProvider

本文关键字:项目 ObjectDataProvider 绑定 何删除 删除 ListView | 更新日期: 2023-09-27 18:03:55

我绑定了一个ListView到ObjectDataProvider。我从用户那里得到一些值,并在运行时改变我的ObjectDataProvider,但当我的ObjectDataProvider更新了它的所有项目添加到ListView并替换它们。我使用这个语句:

lstUsers.Items.Clear();

但是我得到这个错误:

操作在使用ItemsSource时无效。使用ItemsControl访问和修改元素。ItemsSource。

我如何从listview中删除所有数据,当它绑定到ObjectDataProvider?

感谢

编辑1):下面是我的代码:

public partial class Page_ObjectDataProvider : Window
{
    public Page_ObjectDataProvider()
    {
        InitializeComponent();
    }
    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
    }
    private void button1_Click(object sender, RoutedEventArgs e)
    {
        int myValue =10;
        ((ObjectDataProvider)this.FindResource("ADUsers")).MethodParameters.Clear(); 
        ((ObjectDataProvider)this.FindResource("ADUsers")).MethodParameters.Add(myValue);
        ((ObjectDataProvider)this.FindResource("ADUsers")).Refresh(); 
    }
}
public class CustomData
{
    public int F1 { get; set; }
    public int F2 { get; set; }
    public string F3 { get; set; }
}
public class RetrievCustomData : List<CustomData>
{
    public RetrievCustomData GetSome(int i)
    {
        for (int j = 0; j < i; j++)
        {
            CustomData cd = new CustomData();
            Random rnd = new Random();
            cd.F1 = j;
            cd.F2 = rnd.Next(i);
            cd.F3 = "nima";
            this.Add(cd);
        }
        return this;
    }
}

和XAML:

<Window x:Class="TestWPF.Page_ObjectDataProvider"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:src="clr-namespace:TestWPF"
    xmlns:sys="clr-namespace:System;assembly=mscorlib"
    Title="ObjectDataProvider" Height="362" Width="360" Loaded="Window_Loaded">
<Window.Resources>
    <ObjectDataProvider x:Key="ADUsers" ObjectType="{x:Type src:RetrievCustomData}"
                MethodName="GetSome">
        <ObjectDataProvider.MethodParameters>
            <sys:Int32>20</sys:Int32>
        </ObjectDataProvider.MethodParameters>
    </ObjectDataProvider>
</Window.Resources>
<Grid>
    <ListView x:Name="lstUsers"
            ItemsSource="{Binding Source={StaticResource ADUsers}}" Margin="0,0,0,106">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="User Name"
                        Width="80"
                        DisplayMemberBinding="{Binding Path=F1}" />
                <GridViewColumn Header="Group Distinguished Name"
                        Width="80"
                        DisplayMemberBinding="{Binding Path=F3}" />
                <GridViewColumn Header="Group Distinguished Name"
                        Width="80"
                        DisplayMemberBinding="{Binding Path=F2}" />
            </GridView>
        </ListView.View>
    </ListView>
    <Button Content="Get" Height="58" HorizontalAlignment="Left" Margin="64,253,0,0" Name="button1" VerticalAlignment="Top" Width="179" Click="button1_Click" />
</Grid>

如果我设置DataContext或我的ObjectDataProvider为null,那么它不会再次绑定。简单地说,我想更新ObjectDataProvider并将新值绑定到我的ListView

如何删除ListView中的所有项目,当它绑定到ObjectDataProvider

您可以清除ListView的ItemsSource属性来清除条目。

lstUsers.ClearValue(ListView.ItemsSourceProperty);

WPF没有ObjectDataSource类。你指的是ObjectDataProvider吗?或者您的意思是使用对象集合作为数据源?

ListView(或任何项控件)的数据源应该是实现INotifyCollectionChanged的集合。WPF中最常用的类型是ObservableCollection<T>,但您也可以使用其他类型。

如果你填充了一个有变更通知的集合,并绑定了一个items控件的ItemsSource到集合,那么任何时候你从集合中添加或删除一个对象,结果将反映在items控件显示的内容中。

简而言之,要从ListView中删除所有项,请清除ItemsSource绑定的集合。

如果集合不支持更改通知,那么这将不起作用。在这种情况下,您必须刷新到项目源的绑定。例如,如果它绑定到支持更改通知的属性,则只需为该属性引发PropertyChanged,绑定将刷新项。如果您在代码隐藏中设置了ItemsSource,那么您可能必须将其设置为null,然后再将其设置回来,这将强制刷新绑定。

您可能会想,"这似乎是一个愚蠢的hack,"并且您是对的:WPF是围绕绑定和属性更改通知设计的,如果您在代码中操作这些属性,那么您基本上就做错了。

您可以从数据源中删除项或设置ListView。

简单的答案是明确数据的来源。然后将清除的源设置为列表视图的源。

//This is where you get my items source
List.Clear();
//Set the clear list at the items source again.
ListView.ItemsSource = List;

这样你的listview仍然绑定到这个数据源。不要将源设置为空。