2011-07-30 2 views
3

ListViewをObjectDataProviderにバインドしました。ユーザーから値を取得し、実行時にObjectDataProviderを変更しますが、ObjectDataProviderがListViewに追加してObjectDataProviderをバインドするときにListView内のすべてのアイテムを削除する方法

lstUsers.Items.Clear(); 

が、私はこのエラーを取得:この文を使用

Operation is not valid while ItemsSource is in use. Access and modify elements with ItemsControl.ItemsSource instead.

それはたObjectDataProviderにバインドだとき、私は、リストビューからすべてのデータを削除するにはどうすればよいですか?

おかげ

EDIT 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> 

私がnullにDataContextのか、私のObjectDataProviderを設定している場合それは再びバインドしません。私は更新したいです。ObjectDataProviderと新しい値をListViewにバインドする

答えて

1

DataSourceから項目を削除するか、ListView.DataSourceをnullに設定することができます。

+0

私はnull'なので 'に' DataContext'を設定したが、何も私がObjectDataSourceの – Arian

+0

を変更していない私の編集1 – Arian

2

ListViewのItemsSourceプロパティをクリアしてアイテムをクリアすることができます。

lstUsers.ClearValue(ListView.ItemsSourceProperty); 
2

WPFにはObjectDataSourceクラスがありません。 ObjectDataProviderを意味しますか?それとも、データソースとしてオブジェクトのコレクションを使用しているという意味ですか?

ListView(または任意のアイテムコントロール)のデータソースは、INotifyCollectionChangedを実装するコレクションである必要があります。 WPFで最も一般的に使用されるタイプはObservableCollection<T>ですが、使用できる他のタイプもあります。

通知を変更するコレクションを作成し、アイテムコントロールのItemsSourceをコレクションにバインドすると、コレクションにオブジェクトを追加または削除すると、結果はアイテムコントロールの表示内容に反映されます。

つまり、ListViewからすべてのアイテムを削除するには、ItemsSourceがバインドされているコレクションをクリアします。

コレクションが変更通知をサポートしていない場合、これは機能しません。この場合、アイテムソースへのバインディングを更新する必要があります。たとえば、変更通知をサポートするプロパティにバインドされている場合は、そのプロパティに対してPropertyChangedを呼び出すだけで、バインドによってアイテムが更新されます。コードの後ろにItemsSourceを設定した場合は、それをnullに設定してから戻す必要があります。これにより、バインディングが強制的に更新されます。

WPFはバインディングとプロパティーの変更に関する通知のために設計されています。コードビハインドでこれらのプロパティを操作すると、あなたはかなり大丈夫ですそれは間違っている。

+0

のWinFormない使用 – Arian

+0

言った理由を私は知らない私は、WPFはあなたがright.I編集マイpost.Sorryある – Arian

+1

Iドンをご覧ください。あなたが 'Refresh'を呼び出したときに、ODPがなぜリフレッシュしないのか分かりません。それはそうでなければならないようです。しかし、あなたのクラスの周りのビューモデルラッパーをコーディングするほうが良いかもしれないほど十分なコードを書いているように思えます。 –

0

単純な回答は、データの出所を明確にしています。次に、クリアされたソースをリストビューのソースとして設定します。

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

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

このようにして、リストビューは引き続きこのデータソースにバインドされます。ソースをnullに設定しないでください。

関連する問題