問題タブ [datatemplate]
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 - ListBox の DataTemplate の WPF アクセス コントロール
私は WPF オーダー マネージャー アプリを構築していますが、対処方法がわからない状況に遭遇しました。
注文ごとに注文書リクエストのリストを再バインドしたいのですが、アプリに注文書リクエスト パネルが表示されている場合にのみ実行したいと思います (注文をダブルクリックして、注文書リクエストのリストを表示します)。私が抱えている問題は、発注書リクエストが Order リストボックスの各リスト項目内のリストボックスであり、リスト項目内のコントロールをトラバースする方法が見つからないことです (OrderInfo などの実際のオブジェクトを反復処理することしかできません)。
私がやりたいことは
注文書リクエストを表示する 2 つの注文と 代替テキストを表示しない 1 つの注文を含む CRM の例 http://www.readyflowers.co.uk/images/crm-datatemplate.png
代替テキストを達成したい結果http://www.readyflowers.co.uk/images/crm-datatemplate-saved.png
wpf - サブオブジェクト タイプに基づく DataTemplate の選択
ItemsCollection をデータバインドしたいのですが、コレクション アイテムをレンダリングする代わりに、コレクション アイテムのプロパティを介して到達したサブオブジェクトをレンダリングしたいと考えています。
より具体的に言うと、これはゲームの 2D マップ ビューアーになります (ただし、現在の状態ではまだ 2D ではありません)。ItemsControl を ObservableCollection<Square> にデータバインドします。Square には Terrain (Terrain 型) というプロパティがあります。Terrain は基本クラスであり、さまざまな子孫があります。
私が欲しいのは、ItemsControl が、コレクション要素自体ではなく、各コレクション要素から Terrain プロパティをレンダリングすることです。
私はすでにこれを機能させることができますが、不必要なオーバーヘッドがあります。不要なオーバーヘッドを取り除く良い方法があるかどうか知りたいです。
私が現在持っているのは、次のクラスです(簡略化):
また、以下を含む MapView と呼ばれる UserControl:
このコードを考えると、次のようになります。
期待どおりのものが得られます。黄褐色のボックス (ダート用) と銀色のボックス (スチールプレート用) を含む StackPanel です。しかし、私は不必要なオーバーヘッドでそれを取得します。
私の具体的な懸念は、Square の DataTemplate にあります。
私が本当に言いたいのは、「いいえ、わざわざ Square 自体をレンダリングするのではなく、Terrain プロパティを代わりにレンダリングすることです」ということです。これはそれに近いものですが、これにより、すべての Square のビジュアル ツリーに 2 つのコントロールが追加されます。上記の XAML で明示的にコード化された ContentControl と、その ContentPresenter です。ここでは特に ContentControl は必要ありません。Terrain プロパティの DataTemplate を短絡してコントロール ツリーに直接挿入したいのです。
しかし、collectionitem をレンダリングする (そして Square オブジェクトの DataTemplate を探す) のではなく、collectionitem.Terrain をレンダリングする (Terrain オブジェクトの上記の DataTemplates の 1 つを検索する) ように ItemsControl に指示するにはどうすればよいでしょうか?
地形には DataTemplates を使用したいのですが、必ずしも広場には必要ありません。これは、適切に機能することがわかった最初のアプローチでした。実際、私が本当にやりたいことは、まったく別のことです。実際には、ItemsControl の DisplayMemberPath を「Terrain」に設定したいと考えています。これにより、追加の ContentControl または ContentPresenter を追加することなく、適切なオブジェクト (Dirt または SteelPlate オブジェクト) が直接レンダリングされます。残念ながら、DisplayMemberPath は常に文字列をレンダリングし、地形の DataTemplates を無視します。それは正しい考えですが、私には役に立ちません。
このすべてが時期尚早の最適化かもしれません。欲しいものを手に入れる簡単な方法がない場合は、手に入れたもので生きていきます。しかし、コレクション項目全体ではなくプロパティにバインドする方法についてまだ知らない「WPF の方法」があれば、WPF の理解が深まります。
wpf - DataTemplate.DataTrigger を取得して大なり小なりチェックするにはどうすればよいですか?
次の例では、年齢が30DataTemplate.DataTrigger
の場合、年齢を赤く表示します。
年齢が 30 歳以上の場合、年齢を赤く表示するにはどうすればよいですか?
c# - ObservableCollection の既存の要素を更新するにはどうすればよいですか?
ObservableCollection のインスタンスを、2 つの個別のデータ テンプレート (1 つは表示用、もう 1 つは編集用) を持つ WPF リストボックスにバインドしています。編集用のデータ テンプレートには、テキスト ボックスに一方向のバインディングがあり、[保存] ボタンがあります。
[保存] ボタンを押したときに (リスト項目を編集モードにした後)、テキストボックスを変更して ObservableCollection (および表示) の値を置き換えるには、どのような変更を加える必要がありますか?
wpf - WPF - TextBlock のハイパーリンク用の DataTemplate/Value Converter
人の名前、電子メール、部門などのリストを表示する ListBox があります。各プロパティを表示するためのいくつかの TextBlocks を持つ DataTemplate があります。これらの TextBlocks の 1 つは、ハイパーリンクをラップして、電子メール アドレスを次のように表示します。
これは問題なく機能しますが、その人が電子メール アドレスを持っていない場合、TextBlock は自動的に折りたたまれません。そこで、値コンバーターを作成し、次のようなスタイルで使用しました (簡略化):
これは、ValueConverter を使用したスタイルです。
そして、コンバーターを呼び出すスタイルを TextBlock に追加しました。
この変更後、電子メール アドレスは表示されません。値コンバーターでは、TextBlock のテキストは常に空で、Visibility.Collapsed が返されます。ハイパーリンクが読み込まれる前に TextBlock のテキストを評価しているようなものです...
これを理解するのを手伝ってください。
ありがとう!
silverlight - BlendのCLRオブジェクトに対するSilverlightデータバインディング
CLRオブジェクトへのデータバインディングをセットアップし、Silverlightコントロール/ページを設計できるBlendの機能が大好きです。私の問題は、DataTemplateとして使用されるユーザーコントロールの作成に関するものです。それはすべてBlendでうまく機能しますが、設計時のみです。問題は、Blendでコントロールを編集していて、テキストボックスをCLRオブジェクトのプロパティにバインドすると、次のようになることです。
しかし、アプリを実行する準備ができて、DataTemplate内でそのユーザーコントロールを使用してリストボックスなどを作成する場合は、次のようにする必要があります。
Belndでデザインするために気の利いたバインディングを使用するにはどうすればよいですか?プロジェクトを実行する準備ができたら、これらのバインディングすべてに触れたり、検索したり、置き換えたりする必要はありませんか?設計時と実行時の両方で機能するアプローチを探しています。
ありがとう、
wpf - WPFメモリ使用量
応用:
- 上部のテキストボックスと下部のリストボックスで構成されるWPFアプリケーション
- ユーザーがテキストボックスに文字列を入力して従業員を検索すると、検索結果がリストボックスに表示されます
- ListBoxは、DataTemplatesを使用して要素を表示します(従業員名、部門、電話番号、サムネイル画像を表示します)。
実装:
- アプリケーションの起動時に、データベースにクエリを実行し、リストボックスに表示されるすべての従業員と関連情報を取得します。これは常にメモリに保持されます。
- アプリケーションの起動後、検索可能なデータはすべてメモリ内にあり、検索は事実上瞬時に行われます。すべての検索は、すでにメモリにあるデータに対して実行されます。
- 検索結果は、DataTemplatesを使用してリストボックスに表示されます。サムネイル画像、名前、電話番号、部門などが各リストボックス項目に表示されます。
問題:
- 起動時のメモリ使用量は約200MBです。
- 新しい検索またはリストボックスを下にスクロールするだけでリストボックス内のデータが変更されると、メモリ消費量が増加します。
- ユーザーがリストボックスをゆっくりと下にスクロールすると、メモリがより速く増加します。上下にスクロールすると、メモリはすぐに1GBに達します。
コントロールを手動で作成するコードはありません。すべてがデータバインディングを介して行われます。
なぜこの動作が見られるのですか?それを修正するにはどうすればよいですか?助けてください!
更新:問題はメモリリークではないことがわかりました。ここでの問題は、リストボックスが従業員の画像を表示するオブジェクトを作成しており、リストボックスアイテムがウィンドウから出た後、ガベージコレクター用にリリースされていないことです。CleanUpVirtualizedItemイベントは予想どおりに発生しますが、メモリはまだ解放されていません。何か案は?
wpf - MEFを使用してWPFDataTemplateをインポートしますか?
私はMEFを拡張性フレームワークと見なしていましたが、1つの点を除いて、ほとんど売れています。
ViewModelとViewの両方をインポートして表示したいとします。そのための「正しい」方法は、MEFパーツがViewModelクラスと、ViewModelを表示するDataTemplateをエクスポートすることだと思います。例として、Visioのようなアプリケーションを作成していて、図形のライブラリをインポートするとします。各図形には、Xamlで定義されたビューと、基になるModelオブジェクトをラップするViewModelが必要です。
これは可能ですか?DataTemplateのインポートコントラクトはどのようになりますか?インポートされたDataTemplateをWPFに認識させるにはどうすればよいですか?
wpf - ListBoxItem の子要素を列挙する
実際のビジュアルは、DataTemplate によって決定されます。実行時に、ListBoxItem のすべてのビジュアル要素を反復処理するにはどうすればよいですか?
wpf - WPF - DataTemplate の MenuItem のコマンド
Image を含む DataTemplate があります。Image に、MenuItem を含む ContextMenu を追加しました。MenuItem にコマンドを関連付けました。次に、DataTemplate を使用してビューでコマンドを処理します。
CanExecute ハンドラーには、e.CanExecute = true があります。ただし、Executed ハンドラーは実行されません。Command の割り当てである MenuItem を削除すると、イメージを右クリックしたときにメニューが正しく表示されます。
私は何を間違っていますか?
ありがとう!