私は最近、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にインターフェイスクラスを作成しているので、自分のものを入れることができます。アイテムの追加において柔軟性を発揮しません。
ItemsSource
をDataContext
と呼ばれる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}" ... />
ItemsSource
をObservableCollection<Student>
にバインドしているので、リストをクリアしたいときに呼び出すことができます:
Students.Clear()
奇妙だが真実:XAMLファイルの次の誤ったキーストロークにより、「ItemsSourceの使用中は操作は無効です。代わりにItemsControl.ItemsSourceを使用して要素にアクセスして変更します。」というエラーが発生しました。
</ItemsControl.ItemTemplate>x`
終了要素タグの後の「x」文字に注意してください。
私はこの質問が約2年前に回答されたことを知っていますが、私自身もこの問題を抱えており、自分で解決策を考えてみました。たぶんこれは特定のシナリオでは機能せず、おそらく私は何かを見ないだけかもしれませんが、それは私のために働いたので、ここで共有しています:
listView.ClearValue(ItemsControl.ItemsSourceProperty);
listView.ItemsSource = NewSource;
これが誰かの役に立つことを心から願っています。
私が知っているパーティーに遅れて、しかし、私はこの答えが上でそれほど明確ではないと思う。不正なキャラクターの投稿に関連していますが、これにより例外も発生します。
<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>
新人として(または最初の朝のコーヒーの前に)最初のものが正しいと考えるのは簡単で、例外は何が間違っているのかを説明するものではありません。
ItemsSource
にデータバインドされているコレクションに対して作業する必要があります。コレクションの変更通知を取得するには(アイテムが追加または削除されたとき)、 ObservableCollection<T>
を使用する必要があります。
var students = new ObservableCollection<Student>(search.students());
listBoxSS.ItemsSource = students;
students.Clear();
students.Add(new Student("ABC"));
また、XAMLからItemsSource="{Binding Items}"
宣言を削除する必要があります。
リストボックスのItemsSourceプロパティをフォームのクラス内のパブリックプロパティに割り当てます。次に、リストボックスアイテムのソースでclearを直接呼び出すのではなく、セッター内でPropertyChangedを呼び出して、そこから削除を追加してみてください。
この同じ問題が発生し、最終的に、ItemsSourceとして機能するObservableCollectionではなく、コントロールのItemsSourceに直接新しいアイテムを追加しようとしていることに気付きました。
他の初心者に役立つかもしれないので、これを投稿すると思いました。
構文エラーの結果、同じエラーメッセージが表示されました。 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>