4

Silverlight の組み込み DataGrid の最初の行の自動選択をオフにする方法はありますか?

ユーザーがデータ グリッドで行を選択することに基づいて、多くの機能を構築します。データバインディングまたはソートが実際に問題を引き起こしている場合の SelectionChanged の自動起動。選択の周りにいくつかのガードを配置しようとしましたが、すべての問題をカバーすることはできないようです.

たとえば、画面をロードするときに表示されない TabControl のタブに DataGrid があり、DataGrid にオブジェクトのリストである DataContext のプロパティへのバインディングがあるとします。タブが表示されるまで、グリッドはデータバインドされません。グリッドがデータバインディングであることを示すイベントはありますか? データバインディングのデフォルトの動作は、行を選択しないことではありませんか?

ありがとうマイク

4

5 に答える 5

3

ユーザー コントロールのコンストラクターで false に設定したブール フィールド (例: bool dataGridFirstLoad) を設定しようとしましたか。

次に、DataGrid の SelectionChanged イベントで、dataGridFirstLoad が false かどうかを確認します。false の場合は true に設定し、SelectedItem を null に設定します。

お役に立てれば。

于 2008-11-22T19:51:54.907 に答える
1

これは上記の投稿に似ています(そしてPaulo Tの提案をハッシュします)。これはうまく機能します。// xamlまたはコンストラクターでselectionchangedハンドラーを設定します//ページに2つのグリッドがあるため、それぞれに1つのブールプロパティを作成します

private bool IsFirstLoad { get; set; }
private bool IsFirstLoadDetails { get; set; }
public BookDisplay()
{
  //code here
  this.IsFirstLoad = true;
  this.IsFirstLoadDetails = true;
  BindBooks(); //define this function (not in this snippet for the sake of brevity)
}
private void GridBooks_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
  if (this.IsFirstLoad)
  {
    GridBooks.SelectedItem = -1;
    this.IsFirstLoad = false;
  }
  else
  {
    //do your stuff
  }
}
private void GridBooksWithDetails_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
  if (this.IsFirstLoadDetails)
  {
     GridBooksWithDetails.SelectedItem = -1;
     this.IsFirstLoadDetails = false;
  }
}
于 2009-02-13T16:27:52.153 に答える
1

マイク、

Windows コントロールをラップし、ラップされたウィンドウ グリッドの選択変更イベントをキャッチすることで、この問題を解決しました。

コントロールで、コントロールの Loaded イベントをフックし、読み込まれたときにブール値のプライベート メンバー変数を true に設定します。次に、内部データ グリッドの選択変更イベントをキャッチするときに、コントロールが読み込まれている場合にのみ、独自の選択変更イベントを発生させます。これが完了したら、OnApplyTemplate サブに戻り、内部データ グリッドの選択されたインデックスを -1 に、選択された項目を何も設定しないように設定できます。コントロールの読み込みが完了する前にインデックスと項目の設定が行われるため、selection changed イベントは発生しません。タブ付き環境とタブなし環境の両方でこれを試しましたが、問題なく動作するようです。もう少し難しい問題に移りますが、Windows データ グリッドを並べ替えると (データが ItemsSource にバインドされている間)、表示されたデータの一番上の項目が常に選択されることに気付いたかもしれません。もちろん、これは選択変更イベントを発生させ、以前に選択されていないアイテムに移動します。私が見る限り、選択すべきではありません。これを処理するには、もう少しトリッキーなコーディングを行う必要があります。内側のグリッドの選択が変更されたイベントをキャッチし、その選択された項目を見ると、選択された項目が何も設定されていない場合がほとんどありません。 . 選択がクリアされた場合)、または (ヒント) 列がソートされている場合。並べ替えを行う場合、発生するイベントが 2 つあります。1 つ目は項目の選択解除 (SelectedItem は Nothing) です。2 つ目は、リストの一番上の項目の選択です (SelectedIndex 0)。ここで、内部グリッドの選択変更イベントのイベント ハンドラーにフラグを設定し、項目が何もないという事実をキャッチした場合、前に選択された項目を追跡し、内部データ グリッドの選択された項目を設定できます。前に選択したアイテムに。

これは問題をうまく解決し、いつものように、Windows コントロールをラップするときに望ましくない結果が生じる可能性がありますが、私が知る限り、ロードの問題で最初の行が選択されていることを回避するには、これが唯一の方法のようです。しかし、これはある時点で M$ によって修正されるだろうと想像することしかできません。

これが役に立てば幸いです。

ありがとう、

スコット

于 2008-11-19T07:14:44.513 に答える
0

DataGridのコードはMicrosoftから入手できたため、選択を削除したため、回避する必要はありませんでした。これはSilverlight3.0グリッドの問題ではなくなったと思います。

于 2010-02-03T22:29:44.873 に答える
0

以下のコードでそれを行う必要があります (グリッドを更新/更新するたびに JustRefreshed を true に設定します)。

 int LastSelectedIndex = -1;
 bool JustRefreshed = false;

        private void dataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (JustRefreshed)
            {
                JustRefreshed = false;
                dataGrid.SelectedIndex = LastSelectedIndex;
                return;
            }
            if (e.AddedItems.Count > 0)
            {
                LastSelectedIndex = dataGrid.SelectedIndex;
                        }    
                //Your logic comes here...
            }
        }
于 2009-01-05T15:14:57.490 に答える