【问题标题】:How to Remove all Item in ListView when it bindto ObjectDataProvider绑定到 ObjectDataProvider 时如何删除 ListView 中的所有项目
【发布时间】:2011-07-30 11:18:58
【问题描述】:

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

lstUsers.Items.Clear();

但我收到此错误:

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

当列表视图绑定到 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

【问题讨论】:

    标签: c# wpf listview c#-4.0 objectdatasource


    【解决方案1】:

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

    lstUsers.ClearValue(ListView.ItemsSourceProperty);
    

    【讨论】:

      【解决方案2】:

      WPF 没有 ObjectDataSource 类。你的意思是ObjectDataProvider?还是您只是说您使用对象集合作为数据源?

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

      如果您填充确实更改通知的集合,并将项目控件的ItemsSource 绑定到该集合,那么无论何时您从集合中添加或删除对象,结果都将反映在项目控件显示的内容中。

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

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

      您可能会想,“这似乎是一个愚蠢的 hack”,而且您是对的:WPF 是围绕绑定和属性更改通知而设计的,如果您在代码隐藏中操作这些属性,您几乎可以做到错了。

      【讨论】:

      • 你是对的。我编辑我的帖子。对不起,我不知道为什么我说 ObjectDataSource
      • 我不知道为什么当您调用 Refresh 时 ODP 不刷新。似乎应该如此。但在我看来,您在这里编写了足够多的代码,您最好为您的类编写一个视图模型包装器。
      【解决方案3】:

      您可以从 DataSource 中删除项目或将 ListView.DataSource 设置为 null。

      【讨论】:

      • 我将 DataContext 设置为 null 但没有任何改变
      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-10-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多