web-dev-qa-db-ja.com

ItemsSourceの使用中は、操作は無効です。代わりにItemsControl.ItemsSourceを使用して要素にアクセスして変更します

私は最近、BindingとWPFを初めて使用し、Binding techを使用して複数の列を持つlistBoxを作成する方法を学びました

_ <ListView ItemsSource="{Binding Items}" Margin="306,70,22,17" MouseDoubleClick="listBoxSS_MouseDoubleClick" Name="listBoxSS" >           
    <ListView.View>
            <GridView>
                <GridView.Columns>
                    <GridViewColumn Header="first_name " Width="100" DisplayMemberBinding="{Binding Path=First_name}" />
                    <GridViewColumn Header="last_name" Width="100" DisplayMemberBinding="{Binding Path=Last_name}" />
                    <GridViewColumn Header="phone_number" Width="100" DisplayMemberBinding="{Binding Path=Phones[0]}" />
                    <GridViewColumn Header="notes" Width="100" DisplayMemberBinding="{Binding Path=Notes}" />
                </GridView.Columns>
            </GridView>
        </ListView.View>
    </ListView>
_

そして、これはコードです:

_List<Student> arr = search.students();
        listBoxSS.ItemsSource = arr;
_

問題は、アイテムの追加または削除またはクリアを使用しようとしたときでした

_ listBoxSS.Items.Clear();
_

アイテムのソースを使用する例、またはアイテムを追加または削除する方法、またはリストをクリアする方法が必要です。

編集:

_<ListView ItemsSource="{Binding Items}" Margin="306,70,22,17" MouseDoubleClick="listBoxSS_MouseDoubleClick" Name="listBoxSS" >
    <ListView.View>
        <GridView>
            <GridView.Columns>
                <GridViewColumn Header="first_name " Width="100" DisplayMemberBinding="{Binding Path=First_name}" />
                <GridViewColumn Header="last_name" Width="100" DisplayMemberBinding="{Binding Path=Last_name}" />
                <GridViewColumn Header="phone_number" Width="100" DisplayMemberBinding="{Binding Path=Phones[0]}" />
                <GridViewColumn Header="notes" Width="100" DisplayMemberBinding="{Binding Path=Notes}" />
            </GridView.Columns>
        </GridView>
    </ListView.View>
</ListView>
_

コードは次のとおりです。

_ ObservableCollection<Employee> Gemployees;
var employees = new ObservableCollection<Employee>(search.employees());
_

search.employees()は私のDBの全従業員のリストを取得します

_ listBoxPE.ItemsSource = employees;
        Gemployees = employees;
_

今、私はGemployeesですべてのメソッドを実行できます

_ Gemployees.Remove((Student)listBoxSS.SelectedItem);
 Gemployees.Add((Student)listBoxSS.SelectedItem);
_

ListViewは、Gemployeesにアイテムを追加または削除するたびに更新を実行します!!バインディングはクールですが、それでも少し大変です。現在、すべてのListViewにインターフェイスクラスを作成しているので、自分のものを入れることができます。アイテムの追加において柔軟性を発揮しません。

20
Yasser

ItemsSourceDataContextと呼ばれるItemsのプロパティにバインドしているため、コレクションを更新するには、次のItemsプロパティに移動する必要があります。 DataContextをクリアします。

さらに、基になるコレクションが変更されるたびにUIを更新する場合は、ItemsプロパティはObservableCollectionではなくList型である必要があります。

コードビハインドでItemsSourceを設定するコードは不要であり、削除する必要があります。 ItemsSourceを両方ではなく1か所で設定するだけで済みます。

動作の簡単な例を次に示します。

// Using Students instead of Items for the PropertyName to clarify
public ObservableCollection<Student> Students { get; set; }

public MyConstructor()
{
    ...

    Students = search.students();
    listBoxSS.DataContext = this;
}

次の場合:

<ListView ItemsSource="{Binding Students}" ... />

ItemsSourceObservableCollection<Student>にバインドしているので、リストをクリアしたいときに呼び出すことができます:

Students.Clear()
28
Rachel

奇妙だが真実:XAMLファイルの次の誤ったキーストロークにより、「ItemsSourceの使用中は操作は無効です。代わりにItemsControl.ItemsSourceを使用して要素にアクセスして変更します。」というエラーが発生しました。

</ItemsControl.ItemTemplate>x`

終了要素タグの後の「x」文字に注意してください。

13
Brett

私はこの質問が約2年前に回答されたことを知っていますが、私自身もこの問題を抱えており、自分で解決策を考えてみました。たぶんこれは特定のシナリオでは機能せず、おそらく私は何かを見ないだけかもしれませんが、それは私のために働いたので、ここで共有しています:

listView.ClearValue(ItemsControl.ItemsSourceProperty);
listView.ItemsSource = NewSource;

これが誰かの役に立つことを心から願っています。

12
Matthijs H

私が知っているパーティーに遅れて、しかし、私はこの答えが上でそれほど明確ではないと思う。不正なキャラクターの投稿に関連していますが、これにより例外も発生します。

<ItemsControl ItemsSource="{Binding AnObservableCollection}">
    <Label Content="{Binding Name}"/>
</ItemsControl>

あなたが言っていたのは:

<ItemsControl ItemsSource="{Binding AnObservableCollection}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <Label Content="{Binding Name}"/>
            </StackPanel>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

新人として(または最初の朝のコーヒーの前に)最初のものが正しいと考えるのは簡単で、例外は何が間違っているのかを説明するものではありません。

7
Tim Rutter

ItemsSourceにデータバインドされているコレクションに対して作業する必要があります。コレクションの変更通知を取得するには(アイテムが追加または削除されたとき)、 ObservableCollection<T> を使用する必要があります。

var students = new ObservableCollection<Student>(search.students());
listBoxSS.ItemsSource = students;

students.Clear();
students.Add(new Student("ABC"));

また、XAMLからItemsSource="{Binding Items}"宣言を削除する必要があります。

3
Douglas

リストボックスのItemsSourceプロパティをフォームのクラス内のパブリックプロパティに割り当てます。次に、リストボックスアイテムのソースでclearを直接呼び出すのではなく、セッター内でPropertyChangedを呼び出して、そこから削除を追加してみてください。

1
Josh

この同じ問題が発生し、最終的に、ItemsSourceとして機能するObservableCollectionではなく、コントロールのItemsSourceに直接新しいアイテムを追加しようとしていることに気付きました。

他の初心者に役立つかもしれないので、これを投稿すると思いました。

0
Travis

構文エラーの結果、同じエラーメッセージが表示されました。 TreeViewが定義されているItemsSourceのアイテムを誤って定義していたことがわかりました。ツリービューにDataTemplateを定義していましたが、誤って<TreeView>ではなく<TreeView.Resources>に直接配置すると、エラーが発生しました。

私が持っていたもの:

<TreeView ItemSource ="{Binding Items}">
  <HierarchicalDataTemplate> ... </HierarchicalDataTemplate>
  <DataTemplate> ... </DataTemplate>
</TreeView>

私が持っているべきだったもの:

<TreeView ItemSource ="{Binding Items}">
  <TreeView.Resources>
    <HierarchicalDataTemplate> ... </HierarchicalDataTemplate>
    <DataTemplate> ... </DataTemplate>
  </TreeView.Resources>
</TreeView>
0
Andrew Case