C# 如何删除ListView中绑定到ObjectDataProvider时的所有项
我将ListView绑定到ObjectDataProvider。我从用户处获得一些值,并在运行时更改我的ObjectDataProvider,但当我的ObjectDataProvider更新其所有项时,将其添加到ListView并替换它们。我使用以下语句: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
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没有刷新。看起来应该是这样。但在我看来,您在这里编写的代码已经足够多了,因此最好在类周围编写一个视图模型包装器。