0

RowDetailsVisibilityMode = DataGridRowDetailsVisibilityMode.VisibleWhenSelected の標準の Silverlight DataGrid があります。

XAML と親コントロールの Loaded イベントの両方でこのプロパティを設定しようとしました。親の Loaded イベントで、グリッドの itemsource を設定してから、選択したインデックスを手動で 0 に設定しています。これは RowDetailsVisibilityChanged イベントを発生させません。

ただし、新しい行をクリックして選択を変更すると、起動します。その最初の選択の行の「DetailElement」にアクセスして、その中のコントロールにデータを入力する必要があります。ただし、その DetailElement を取得する方法を知っている唯一の方法は、RowDetailsVisibilityChanged イベントにあります。

これが私のコードです:

void ViewAssociationUserControl_Loaded(object sender, RoutedEventArgs e)
    {
        viewAssociationsDataGrid.RowDetailsVisibilityMode = DataGridRowDetailsVisibilityMode.VisibleWhenSelected;
        viewAssociationsDataGrid.ItemSource = myData;
        viewAssociationsDataGrid.SelectedIndex = 0;
    }

private void viewAssociationsDataGrid_RowDetailsVisibilityChanged(object sender, System.Windows.Controls.DataGridRowDetailsEventArgs e)
    {
        if (viewAssociationsDataGrid.RowDetailsVisibilityMode == DataGridRowDetailsVisibilityMode.VisibleWhenSelected
            && e.Row.DetailsVisibility == System.Windows.Visibility.Visible)
        {
            Grid detailElement = e.DetailsElement as Grid;
            if (detailElement != null)
            {
                ListBox assocControl = detailElement.FindName("oneToManyGridPanel") as ListBox;
                UpdateOneToManyPanel(assocControl);
            }
        }
    }
4

2 に答える 2

1

このシナリオをきれいに処理する方法がわからなかったため、最初の「選択変更」の発生をハイジャックしてしまい、初めて、可視性変更イベントを自分で手動で発生させました。

private void viewAssociationsDataGrid_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
    {
        if (!initialTriggerFired) //manually fire the visibility the first time
        {
            initialTriggerFired = true;
            DataGrid dataGrid = sender as DataGrid;

            int selectedIndex = dataGrid.SelectedIndex;
            if (selectedIndex > -1)
            {
                DataGridColumn column = dataGrid.Columns[0];
                FrameworkElement fe = column.GetCellContent(dataGrid.SelectedItem);
                DataGridRow row = fe.GetAncestorOfType<DataGridRow>();

                if (row != null)
                {
                    row.DetailsVisibility = System.Windows.Visibility.Collapsed;
                    row.DetailsVisibility = System.Windows.Visibility.Visible;
                }
            }
        }
    }
于 2012-05-02T21:06:21.697 に答える
0

問題は、データグリッドがデフォルトで選択されたインデックスを0に設定することです。イベントハンドラーで設定するだけviewAssociationsDataGrid.SelectedIndex = -1ViewAssociationUserControl_Loaded、最初の行が最初に選択されたときに選択の変更が登録されるようになります。

于 2012-05-21T17:00:20.677 に答える