30

私はBindingとWPFを初めて使用しますが、 listBoxBindingtechを使用して複数の列を含むを作成する方法を最近学びました。

 <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従業員にアイテムを追加または削除するたびに更新を実行してください!! かっこいいですが、それでもバインディングには少し大変な作業があります。今、私はすべてのListViewに対してインターフェイスクラスを実行しているので、自分のものをそこに入れることができます。アイテムの追加に柔軟性はありません。

4

11 に答える 11

33

を呼び出さItemsSourceれたのプロパティにバインドしているため、コレクションを更新するには、のプロパティに移動してクリアする必要があります。DataContextItemsItemsDataContext

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

コードビハインドを設定する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}" ... />

にバインドしItemsSourceているObservableCollection<Student>ので、リストをクリアしたい場合は、次のように呼び出すことができます。

Students.Clear()
于 2012-06-18T19:32:20.643 に答える
18

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

</ItemsControl.ItemTemplate>x`

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

于 2014-06-13T19:35:12.857 に答える
16

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

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

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

于 2014-06-01T09:21:57.773 に答える
3

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

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

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

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

于 2012-06-18T18:52:45.973 に答える
1

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

于 2012-06-18T18:51:39.560 に答える
0

私はこれと同じ問題を抱えていましたが、最終的に、ItemsSource として機能する ObservableCollection ではなく、コントロールの ItemsSource に新しい項目を直接追加しようとしていることに気付きました。

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

于 2014-04-11T02:21:47.227 に答える
0

私にとっての問題は、コントロールの指示を誤解し、誤ってデータグリッド コントロールの外側ではなく内側に配置してしまったことです。

    <DataGrid> 
        <mytag the tag for the open source control />
    </DataGrid>

上記の誰かが無関係な文字について言及しましたが、突然、DataGrid がそれを気に入らなかった可能性があることに気付きました。私はそれを移動し、出来上がり、エラー

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

行ってしまった!実際には ItemsSource とは何の関係もありませんでしたが、その Microsoft エラーを生成しているパーサーが何であれ混乱していました。

于 2021-09-15T23:29:21.717 に答える