Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何删除ListView中绑定到ObjectDataProvider时的所有项_C#_Wpf_Listview_C# 4.0_Objectdatasource - Fatal编程技术网

C# 如何删除ListView中绑定到ObjectDataProvider时的所有项

C# 如何删除ListView中绑定到ObjectDataProvider时的所有项,c#,wpf,listview,c#-4.0,objectdatasource,C#,Wpf,Listview,C# 4.0,Objectdatasource,我将ListView绑定到ObjectDataProvider。我从用户处获得一些值,并在运行时更改我的ObjectDataProvider,但当我的ObjectDataProvider更新其所有项时,将其添加到ListView并替换它们。我使用以下语句: lstUsers.Items.Clear(); 但我得到了这个错误: ItemsSource正在使用时,操作无效。改为使用ItemsControl.ItemsSource访问和修改元素 当listview绑定到ObjectDataProvi

我将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;
    }
}
公共部分类页面\u ObjectDataProvider:窗口
{
公共页面_ObjectDataProvider()
{
初始化组件();
}
已加载私有无效窗口(对象发送器、路由目标)
{
}
私有无效按钮1\u单击(对象发送者,路由目标)
{
int-myValue=10;
((ObjectDataProvider)this.FindResource(“ADUsers”).MethodParameters.Clear();
((ObjectDataProvider)this.FindResource(“ADUsers”).MethodParameters.Add(myValue);
((ObjectDataProvider)this.FindResource(“ADUsers”).Refresh();
}
}
公共类自定义数据
{
公共int F1{get;set;}
公共int F2{get;set;}
公共字符串F3{get;set;}
}
公共类检索自定义数据:列表
{
公共检索customdata GetSome(int i)
{
对于(int j=0;j
以及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>

20


如果我将DataContext或my
ObjectDataProvider
设置为null,则它不会再次绑定。我只想更新
ObjectDataProvider
并将新值绑定到我的ListView

您可以从数据源中删除项,也可以将ListView.DataSource设置为null。

您可以清除ListView的ItemsSource属性以清除项目

lstUsers.ClearValue(ListView.ItemsSourceProperty);

WPF没有ObjectDataSource类。你的意思是
ObjectDataProvider
?或者你只是说你正在使用一组对象作为你的数据源

列表视图
(或任何项控件)的数据源应该是实现
INotifyCollectionChanged
的集合。WPF中最常用的类型是
ObservableCollection
,但也有其他类型可以使用

如果您填充了一个没有更改通知的集合,并将items控件的
ItemsSource
绑定到该集合,则无论何时从集合中添加或删除对象,结果都将反映在items控件显示的内容中

简而言之,要从
列表视图
中删除所有项目,请清除
项目资源
绑定到的集合

如果集合不支持更改通知,那么这将不起作用。在这种情况下,必须刷新到源项的绑定。例如,如果它绑定到一个支持更改通知的属性,您可以为该属性引发
PropertyChanged
,绑定将刷新项目。如果您在code behind中设置了
项资源
,则可能必须将其设置为
null
,然后将其设置回原位,这将强制刷新绑定


你可能会想,“这看起来像是一个愚蠢的黑客”,你是对的:WPF是围绕绑定和属性更改通知设计的,如果你在代码中操纵这些属性,那么你就大错特错了。

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

//This is where you get my items source
List.Clear();

//Set the clear list at the items source again.
ListView.ItemsSource = List;

这样,listview仍然绑定到此数据源。不要将源设置为null

我将
DataContext
设置为
null
但没有任何更改。你是对的。我编辑了我的帖子。对不起,我不知道为什么我说ObjectDataSourceI,我不知道为什么在调用
Refresh
时ODP没有刷新。看起来应该是这样。但在我看来,您在这里编写的代码已经足够多了,因此最好在类周围编写一个视图模型包装器。