2

20 列程度の SDK:DATAGRID がありますが、開くと 4 つのフィールド/列しか表示されません。これは私が欲しいものであり、どのように設計したか

基本的に、ユーザーのクリックに基づいて情報を取得しています - 例:

OWNERNAME.Text = ((TextBlock)EPICGrid.Columns[1].GetCellContent(EPICGrid.SelectedItem)).Text;

および/または

OWNERNAME2.Text = ((TextBlock)EPICGrid.Columns[16].GetCellContent(EPICGrid.SelectedItem)).Text;

私が実行しているのは、スクロールして列を表示しない限り、セル内の情報を取得しないため、グリッドが表示されたときに表示されるため、データの最初の 4 列のみを取得できます。

スクロールしてそれらの列を表示しない限り、列 5 ~ 20 からデータを取得することはできません。クリック中に表示される必要はありません...列を表示するまでデータが実際に読み込まれないようです。

最初のレコード/行がすべてのデータ/セル/列をロードし、最初のレコードから任意のデータを取得できると言うべきだと思いますが、問題はレコード 2 - * で発生します。

明確にするために、私の問題は列や行の可視性ではありません。私の問題は、SDK DataGrid がオンデマンドでデータをロードしているように見えることです。そのため、ある時点で列が表示されていない場合、セル内の情報は利用できません。

すべての列を表示したくないし、ユーザーにすべての列を表示する機能を与えたくないので、スクロール バーを無効にしたいのですが、ユーザーが特定の行をクリックすると、特定のセルの情報を取得する必要があります列はまだロードされていないため、情報はありません。

機能のロード オン デマンドをオフにするにはどうすればよいですか?

検索を行ったところ、誰かが行の読み込みで同様の問題を抱えており、提案が設定されていることがわかりましたVirtualizingStackPanel.VirtualizationMode = Standard

問題は VirtualizingStackPanel.VirtualizationMode に起因しているようですが、このプロパティを標準に設定してリサイクルしましたが、うまくいきませんでした。

定義は次のとおりです。

既定では、VirtualizingStackPanel は、表示されている各アイテムのアイテム コンテナーを作成し、不要になったとき (アイテムがスクロールして表示されなくなったときなど) に破棄します。ItemsControl に多数のアイテムが含まれている場合、アイテム コンテナーを作成および破棄するプロセスがパフォーマンスに悪影響を及ぼす可能性があります。VirtualizingStackPanel.VirtualizationMode が Recycling に設定されている場合、VirtualizingStackPanel は毎回新しいコンテナーを作成するのではなく、アイテム コンテナーを再利用します。

初期ロード時に、セルが表示されていない場合、セルの内容を取得できません (最初のレコード/行でない限り)。セル/列が表示されると、情報が利用可能になります。

4

1 に答える 1

0

行が直接バインドされているデータを処理し、コントロールからデータを引き出すことは期待されていないと思います。これは双方向のデータバインディングであるため、データを変更するとデータが更新されるため、これは理にかなっています (INotifyPropertyChanged インターフェイスを実装していると仮定します)。

例として、データグリッドが MyEntity 型のコレクションにバインドされている場合があります。

     private void DataGrid1_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (this.DataGrid1.SelectedItem == null)
                return;

            MyEntity myEntity = (MyEntity)this.DataGrid1.SelectedItem;

            // at this point you have the (updated) data the row is bound to.
           MessageBox.Show("You Selected: " + myEntity.name);
           ...

もう 1 つの例は、各行にボタンがある場所です。ボタンがクリックされたときに処理するコードは次のようになります。

      private void btnProcessEntity_Click(object sender, RoutedEventArgs e)
      {

         Button btn = sender as Button;
         MyEntity myEntity = btn.DataContext as MyEntity;

          // clicking a button in a row doesn't select the row, so select it.
         this.DataGrid1.SelectedItem = myEntity;  
         MessageBox.Show("Will Process: " + myEntity.name);

          ...
       }

Silverlight で通常使用されるテクノロジの一部に慣れていない場合は、これらのビデオ チュートリアルを参照してください。これは VB.Net ですが、コードは実際には焦点ではなく、Silverlight アプリケーション アーキテクチャに焦点を当てています。「SL4 と WCF Ria サービスの概要」から始めて、MVVM でそのうちの 1 つを表示します。

于 2012-11-27T02:43:02.343 に答える