Как удалить все элементы в ListView, когда он привязан к ObjectDataProvider - PullRequest
3 голосов
/ 30 июля 2011

Я привязал ListView к ObjectDataProvider.Я получаю какое-то значение от пользователя и изменяю свой ObjectDataProvider во время выполнения, но когда мой ObjectDataProvider обновил все его Item, добавьте его в 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 на ноль, то он не будет привязываться снова. Просто я хочу обновить ObjectDataProvider и связать новые значения с моим ListView

Ответы [ 4 ]

2 голосов
/ 30 июля 2011

Вы можете очистить свойство ItemsSource ListView для очистки элементов.

lstUsers.ClearValue(ListView.ItemsSourceProperty);
2 голосов
/ 31 июля 2011

WPF не имеет класса ObjectDataSource.Вы имеете в виду ObjectDataProvider?Или вы просто имеете в виду, что вы используете коллекцию объектов в качестве источника данных?

Источником данных для ListView (или любого элемента управления) должна быть коллекция, которая реализует INotifyCollectionChanged.Наиболее часто используемый тип в WPF - ObservableCollection<T>, но есть и другие типы, которые вы можете использовать.

Если вы заполняете коллекцию, которая изменяет уведомление, и связываете элемент управления элемента ItemsSource с коллекцией,затем каждый раз, когда вы добавляете или удаляете объект из коллекции, результат будет отражен в том, что отображает элемент управления.

Короче говоря, чтобы удалить все элементы из ListView, очистите коллекцию, которая ItemsSource привязан к.

Если коллекция не поддерживает уведомления об изменениях, это не будет работать.В этом случае вам необходимо обновить привязку к источнику элементов.Например, если оно привязано к свойству, которое поддерживает уведомление об изменении, вы можете просто поднять PropertyChanged для этого свойства, и привязка обновит элементы.Если вы установили ItemsSource в коде позади, вам, вероятно, придется установить его на null, а затем установить его обратно, что приведет к обновлению привязки.

Возможно, вы думаете: «это похоже на глупый взлом», и вы правы: WPF разработан для уведомления о связывании и изменении свойств, и если вы манипулируете этими свойствами в коде позади, выпочти все делает неправильно.

1 голос
/ 30 июля 2011

Вы можете удалить элементы из DataSource или установить для ListView.DataSource значение null.

0 голосов
/ 20 октября 2016

Простой ответ - источник ваших данных.Затем установите очищенный источник в качестве источника для представления списка.

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

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

Таким образом, ваше представление списка все еще привязано к этому источнику данных.Не устанавливайте источник на ноль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...