問題タブ [observablecollection]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
wpf - XAML で TabControl を ObservableCollection にバインドする方法
コード ビハインド クラスに次のコード行があります。
これを XAML ファイルに移動したいと思います。
簡単に言えば、
- メインウィンドウを表す MainWindow クラスがあります。
- メインウィンドウに配置された TabControl があります。
- MainWindowViewModel と TabItemViewModel という 2 つのビュー モデルがあります。
- MainWindowViewModel には、監視可能な TabItemViewModel クラスのコレクションがあります。
- MainWindowViewModel は、メイン ウィンドウのビュー モデル クラスです。
- TabItemViewModel は、メイン ウィンドウの TabControl の個々のタブのビュー モデル クラスです。
- MainWindow クラスの DataContext プロパティは、XAML でインスタンス化された MainWindowViewModel クラスのインスタンスに設定されます。
私がやりたいことは、MainWindowViewModel クラスの TabItemViewModels プロパティを TabControl の ItemSources プロパティにバインドすることです。
コード行だけでなく、バインディングの構文に関するいくつかのポインターも探しています。これは、XAML を操作するために非常に重要であるように思われるためです。
c# - 読み取り専用のObservableCollectionプロパティを作成するにはどうすればよいですか?
(データベースからの)オブジェクトのリストを含むビューモデルのプロパティを公開したいと思います。
このコレクションは読み取り専用である必要があります。つまり、追加/削除などを防止したいのですが、foreachとインデクサーが機能するようにします。私の意図は、編集可能なコレクションを保持するプライベートフィールドを宣言し、読み取り専用のパブリックプロパティで参照することです。次のように
ただし、その構文は、コレクションへの参照を変更することを妨げるだけです。追加/削除などを妨げることはありません。
これを達成するための正しい方法は何ですか?
c# - ObservableCollectionListBox を更新しません
ItemsSource
のListBox
をObservableCollection<Employee>
コレクションに設定し、Employee
クラスに を実装しINotifyPropertyChanged
ました。
ではEmployee
、いくつかのプロパティをバインドしました。そのうちの 1 つはColor
プロパティであり、イベントが変更されたときにイベントが呼び出されるようにしましたPropertyChanged
。PropertyChanged
また、呼び出しが呼び出されることをデバッガーで確認しました。
ただし、データバインドされている場合、バインドされたBackground
の が更新ListBoxItem
されListBox
ないため、非常にイライラします。
を null に設定ItemsSource
し、動作後にリセットすることはできますが、これは Observer パターンを利用する方法ではありません。
使用される XAML:
最初の返信に対する追加のコード:
wcf - ObservableCollection は、WCF を使用して転送された後、配列に変わります
「Board」というクラスがあり、そのプロパティの 1 つは ObservableCollection です。ObservableCollection を WCF 経由で (サーバーからクライアントに) 送信し、プロキシから呼び出すと、配列に変換されますが、これは私にとっては良くありません。
送信後に ObservableCollection を保持できますか、それとも ObservableCollection になるまで配列をキックする必要がありますか?
c# - 意見が欲しかった:リスト/コレクションへの変更を傍受する
BindingList<T>
リストの変更を検出するメカニズムを提供しますが、変更が発生する前ObservableCollection<T>
に変更を検出/インターセプトするメカニズムはサポートしていません。
私はこれをサポートするためにいくつかのインターフェースを書いていますが、あなたの意見を広めたいと思います。
オプション1:リストはアクションのタイプごとにイベントを発生させます
ここで、消費者は次のようなコードを書くかもしれません:
オプション2:リストは単一のイベントを発生させ、アクションはイベント引数から決定されます
ここで、消費者は次のようなコードを書くかもしれません:
背景:DDDのコアコンポーネントを表す一連の汎用インターフェイス/クラスを作成しており、ソースコードを利用できるようにしています(したがって、使いやすいインターフェイスを作成する必要があります)。
この質問は、消費者がコアセマンティクスを失うことなく独自のコレクションを導出および実装できるように、インターフェイスを可能な限りまとまりのあるものにすることに関するものです。
PS:私はすでにそのアイデアを割り引いているので、各リストの使用AddXYZ()
と方法を提案しないでください。RemoveXYZ()
PPS:.NET2.0を使用する開発者を含める必要があります:)
winforms - ObservableCollectionWinformsおよび可能な代替手段で
Winforms .net 3.5 アプリ。私のアプリには、次のようなジェネリック クラスがあります。
ある種のフィルター機能を実装したい場合は、すべてのダイアログ ボックスで使用します。そのため、コンストラクターに渡された事前に入力されたダイアログ フォームを呼び出しますList<FilterItem>
。ダイアログが読み込まれると、各リスト項目を反復処理して以下を追加します。
- チェックボックス
- コンボボックス
- テキストボックス
TableLayoutPanel のすべての行に。Checkbox は からテキスト プロパティを取得しFilterProperty
、Checked ステータスは からFilterPropertyChecked
取得します。Combobox は からバインドをFilterOperator
取得し、Textbox は からテキスト値を取得しますFilterValue
。
私がget とだけ言っていることに注意してください。私がやりたいことは、プロパティが変更されるコントロールがバインドされているときに、これらのプロパティを自動的に更新することです。聞いたことObservableCollection<T>
がありますが、名前空間を追加した後、Winforms で「アクセス」できないようですSystem.Collections.ObjectModel
。
これを達成するための最良の方法は何でしょうか。INotifyPropertyChanged を使用した BindingList?? 私は後者の専門家ではなく、いくつかの指針を大いに感謝します-これが私が進むべき道である場合.
ありがとう!
編集:
わかりました、私がやるべきだと思うことを示すためにいくつかのコードを投稿させてください:)。FilterItem クラスに実装する必要があることはわかっているINotifyPropertyChanged
ので、(たとえば FilterValue 部分のみ):
これで、次のようにすべてが Form_Load にまとめられるはずです (これは Textbox 部分のみで、Checbox と ComboBox は省略しました)。
テキストボックスのデータバインディング DataSource は FilterItem 'item' です。しかし、今は私のビジュアル スタジオ IDE に問題があるようです。私が今知りたいのは、このセットアップはFilterItem
、割り当てられたコントロールのそれぞれのプロパティが変更されたときに、個々の を自動的に更新できるようにするのに役立ちますか??
silverlight - ObservableCollectionをDataGridでラップする場合のPagedCollectionViewは、データが存在しない場合に列ヘッダーをクリアします
グループ化にPagedCollectionViewを使用しています。DataGridと検索ボタン付きのテキストボックスがあります。グリッドのItemSourceは私のPagedCollectionViewであり、グリッド内のアイテムはバックグラウンドプロセスによってバインドされたオブジェクトを更新できるため、PagedCollectionViewはObservableCollectionをラップします。[検索]をクリックすると、最初にObservableCollectionでクリアしてから、データベースからのデータをロードします。コレクションをクリアと呼んだ瞬間、列を含め、DataGridのコンテンツが消えます。アイテムが私のコレクションに追加されると、それらは再表示されます。列とそのヘッダーが消えると、並べ替え順序などが失われることは言うまでもなく、非常に不快なものになるため、列とそのヘッダーはそのままにしておく必要があります。ObservableCollectionなので、アイテムはすぐに消えると思います。ただし、前述のバックグラウンドプロセスで行を更新できるようにする必要があります。PagedCollectionViewをラッパーとして削除し、DataGridのItemSourceをObservableCollectionに設定しただけでは、この動作は発生せず、コレクションがクリアされても列とヘッダーは保持され、行はバックグラウンドプロセスによって即座に更新されます。他の誰かがこの振る舞いを観察しましたか?誰かが回避策を知っていますか?それとも私は何か間違ったことをしているだけですか?他の誰かがこの振る舞いを観察しましたか?誰かが回避策を知っていますか?それとも私は何か間違ったことをしているだけですか?他の誰かがこの振る舞いを観察しましたか?誰かが回避策を知っていますか?それとも私は何か間違ったことをしているだけですか?
c# - WPF で ObservableCollection で HashSet を使用する
ListBox を使用して、WPF アプリケーションでアイテムのリストを維持しています。ListBox データ ソースは、ObservableCollection にラップされた HashSet です。つまり、次のコードがあります。
... shackListing は ListBox コントロールであり、shackSet は ICollection にあります。ただし、最初の項目を追加した後に shackSet に何かを追加すると、ListBox に複数の項目が表示されます。つまり、セットに追加されているかどうかに関係なく、新しく追加されたアイテムがリストに追加されているようです。ICollection#Add の署名を見ると:
...そして HashSet#Add :
...これにより、ラップされたHashSetに影響を与えるバグがあり、新しく追加されたアイテムがListBoxに追加されるというバグがあると思われます.ICollection#の戻り値の型追加は無効です。他の誰かがこれを確認できますか?
c# - 基本型にキャストする ObservableCollection ラッパー
Client
のサブクラスである というクラスがありますConfigurable
。
ObservableCollection<Client>
として表示する必要がある がありますObservableCollection<Configurable>
。これにより、一般的なレイアウト生成コードからリストにデータバインドできます。また、リストをクリアし、リストにアイテムを追加できるようにする必要があります。もちろん、リストにアイテムを追加するときは、実行時のタイプ チェックを実行して、Configurable
追加される一般的なアイテム ( ) が適切なタイプ ( Client
) であることを確認する必要があります。
のようなクラスを想像していObservableSurrogateCollection<T>
ます。 T
一般クラス ( Configurable
) です。を渡して構築します。ObservableCollection<T2>
ここで、T2
は のサブクラスですT
。それにデータバインドでき、ラップされたリストのすべてのコレクション変更イベントが正しくルーティングされます (双方向)。
これは存在しますか?これは私がすべきことではありませんか?.NET 4.0 が言語レベルでそのような機能をサポートすることを読んだと思いますか?
私はこれらのオプションを見てきました:
ReadOnlyObservableCollection<T>
. これは本当に近いです。ただし、読み取り専用であるため、アイテムを追加または削除することはできません。- 非ジェネリック
ObservableCollection
. 存在する場合、これを見つけることができないようです。
助けてくれてありがとう!
wpf - ObservableCollection CollectionChanged イベントの処理
Silverlight ツールキットで次のようなコードを見たことがありますが、安全な方法を理解できません。
たとえばインデックス 5 からアイテムを削除すると、_items
インデックス 5 以降のコレクション内のすべてのアイテムの現在のインデックスが以前よりも 1 つ少なくなることはありませんか? では、このコードのように「古い」インデックスを使用してアイテムを継続的に削除することは、どのように安全なのでしょうか?
なぜこれが機能するのかを本当に理解したいです。
何か案は?