2011-09-29 17 views
5

DataGridを継承するカスタムコントロールがあり、基本的には2D DataGridです(double[,]のように2次元のItemsSourceを受け入れます)。WPF DataGridを強制的に再生成する

DependencyPropertyを追加しました。これはColumnHeadersRowHeadersです。これらを定義することができます。ここで

は、それが今どのように動作するかです:

  • 私はラッパー・メソッドは、実際のデータグリッドのItemsSource
  • に古典 IEnumerableバインド可能にそれを変換するために、このソースがかかります DataGrid
  • に2D ItemsSourceをバインド
  • 自動生成された各行/列は、ヘッダを定義するためにAutoGeneratingColumn & AutoGeneratingRowというイベントを使用して実行されます。

ここで問題:

私はDataGridを初期化すると、すべてが正常に動作します。自分のアプリケーションのユースケースの一つは、私はここで行うものは何でも、DependencyPropertyColumnHeaders

を修正することによって(のみ列ヘッダーが変更できることを定義した後

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 
    } 
+0

なぜItemsSourceプロパティをリセットしてみません –

+0

それは実際に(と私は-__-それ以前については考えていないと信じてすることはできません)動作しますが、それを行うには任意の「賢く」方法は何ですか? – Damascus

+0

@Damascus itemsourceの設定を解除して設定するよりスマートな方法を見つけましたか?私もそれを探しています。 – Haozhun

答えて

6

はあなたのItemsSourceをリセットし、それはあなたのデータグリッド

void ResetDataGrid() 
{ 
    var temp = myDataGrid.ItemsSource; 
    myDataGrid.ItemsSource = null; 
    myDataGrid.ItemsSource = temp; 
} 
を再描画する必要があります

あなたはまた、結合をリフレッシュすることができるかもしれませんが、私は、これは実際にデータグリッドを再生成するかどうか確認するためにそれをテストしていません:

void ResetDataGrid() 
{ 
    myDataGrid.GetBindingExpression(DataGrid.ItemsSourceProperty).UpdateTarget(); 
} 
+0

バウンドプロパティが実際のItemsSourceが正常に動作しReseting (ケースされていない)変更されているが、どの「よりエレガントな」解決策がない場合、私は思っていた場合、WPFは、最初に自動的にチェックするようこんにちは、 リフレッシュが動作しません。 ? – Damascus

3

AutogeneratedColumnsをオフにしてからオンにすると、列が自動的に再度生成されます。

dataGrid.AutoGenerateColumns = false; 
dataGrid.AutoGenerateColumns = true; 
+0

私はOPと同様のシナリオを持ち、このソリューションは他のソリューションよりも優れていました。何らかの理由で、ItemsSourceを直接使いこなすと、自動生成が機能しなくなりました。 –

関連する問題