7

から継承しDataGrid、基本的に2Dであるカスタムコントロールがあります(などの2つの次元を持つをDataGrid受け入れます)。ItemsSourcedouble[,]

DependencyProperty特定のものを追加したColumnHeadersのでRowHeaders、それらを定義できます。

現在の動作は次のとおりです。

  • 2DItemsSourceをにバインドしますDataGrid
  • ラッパー メソッドは、このソースを取得しIEnumerableて、実際のデータグリッドにバインド可能なクラシックに変換します。ItemsSource
  • 自動生成された各行/列は、ヘッダーを定義するためにイベントAutoGeneratingColumn&を使用して行われますAutoGeneratingRow

ここでの問題:

を初期化するDataGridと、すべて正常に動作します。

その後、私のアプリケーションのユースケースの 1 つは、列ヘッダーのみを変更できることを定義します (DependencyProperty ColumnHeaders

そして、ここで何をしてもDataGrid、列は再自動生成されません (したがって、ヘッダーはまったく変更されません)。

DataGridでは、 「ねえ、最初からやり直して列を再生成してほしい」のような質問をする方法はありますか? 今のところ、AutoGeneratingColumnイベントに到達できず、次のようなメソッドを呼び出すとInvalidateVisual、グリッドが再描画されるだけです (列は再生成されません)。

ここに何かアイデアはありますか?

いくつかのコードが必要かどうかはわかりませんが... 誰もそれを要求しないようにいくつか入れておきます:D

    /// <summary>
    /// IList of String containing column headers
    /// </summary>
    public static readonly DependencyProperty ColumnHeadersProperty =
        DependencyProperty.Register("ColumnHeaders",
                                    typeof(IEnumerable),
                                    typeof(FormattedDataGrid2D),
                                    new PropertyMetadata(HeadersChanged));

    /// <summary>
    /// Handler called when the binding on ItemsSource2D changed
    /// </summary>
    /// <param name="source"></param>
    /// <param name="e"></param>
    private static void ItemsSource2DPropertyChanged(DependencyObject source, DependencyPropertyChangedEventArgs e)
    {
        FormattedDataGrid2D @this = source as FormattedDataGrid2D;
        @this.OnItemsSource2DChanged(e.OldValue as IEnumerable, e.NewValue as IEnumerable);
    }

        // (in the constructor)
        AutoGeneratingColumn += new EventHandler<DataGridAutoGeneratingColumnEventArgs>(DataGrid2D_AutoGeneratingColumn);

    void DataGrid2D_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
    {
        DataGridTextColumn column = e.Column as DataGridTextColumn;
        column.Header = (ColumnHeaders == null) ? columnIndex++ : (ColumnHeaders as IList)[columnIndex++]; //Header will be the defined header OR the column number
        column.Width = new DataGridLength(1.0, DataGridLengthUnitType.Auto);
        Binding binding = column.Binding as Binding;
        binding.Path = new PropertyPath(binding.Path.Path + ".Value"); // Workaround to get a good value to display, do not take care of that
    }
4

2 に答える 2

7

ItemsSourceをリセットすると、DataGridが再描画されます。

void ResetDataGrid()
{
    var temp = myDataGrid.ItemsSource;
    myDataGrid.ItemsSource = null;
    myDataGrid.ItemsSource = temp;
}

バインディングを更新することもできるかもしれませんが、これが実際にDataGridを再生成するかどうかを確認するためにテストしていません。

void ResetDataGrid()
{
    myDataGrid.GetBindingExpression(DataGrid.ItemsSourceProperty).UpdateTarget();
}
于 2011-09-29T12:51:39.253 に答える
3

Auto generatedColumns をオフにしてからオンに切り替えると、列が再び自動的に生成されます。

dataGrid.AutoGenerateColumns = false;
dataGrid.AutoGenerateColumns = true;
于 2012-04-10T16:51:21.500 に答える