9

IDictionary を介して Datagrid を動的データにバインドしています: http://www.scottlogic.co.uk/blog/colin/2009/04/binding-a-silverlight-datagrid-to-dynamic-data-via-idictionary/comment -page-1/#comment-8681

しかし、xaml で列を定義したくありません (以下は、Colin Eberhardt の投稿で行われている方法です)。

<data:DataGrid.Columns>
    <data:DataGridTextColumn Header="Forename" Binding="{Binding Converter={StaticResource RowIndexConverter}, ConverterParameter=Forename}" />
</data:DataGrid.Columns>

そのため、コード ビハインドで同じことを試みるために次のコードを作成しましたが、コードは RowIndexConverter を呼び出しません。何かが欠けているに違いない。

コード:

// add columns

DataGridTextColumn textColumn = new DataGridTextColumn();
textColumn.Header = "Forename";

Binding bind = new Binding("Forename");
bind.Converter = new RowIndexConverter() ;
bind.ConverterParameter = "Forename";            

textColumn.Binding = bind;
_dataGrid.Columns.Add(textColumn);

コードの残りの部分 (コンテキストについてはこちら):

// generate some dummy data
Random rand = new Random();
for (int i = 0; i < 200; i++)
{
    Row row = new Row();
    row["Forename"] = s_names[rand.Next(s_names.Length)];
    row["Surname"] = s_surnames[rand.Next(s_surnames.Length)];
    row["Age"] = rand.Next(40) + 10;
    row["Shoesize"] = rand.Next(10) + 5;

    _rows.Add(row);
}

// bind to our DataGrid
_dataGrid.ItemsSource = _rows;    

public class Row
{
    private Dictionary<string, object> _data = new Dictionary<string, object>();

    public object this[string index]
    {
        get
        {
            return _data[index];
        }
        set
        {
            _data[index] = value;
        }
    }
}
4

1 に答える 1

9

コンバーターは、プロパティ パスを介してデータを取得した後に呼び出されます。Row には "Forename" プロパティがないため、機能しません (出力ウィンドウに Binding 例外が表示されます)。

Binding 定義を次のように変更して解決しました。

    Binding bind = new Binding();
    bind.Mode = BindingMode.OneWay;

パスなしで双方向バインディングを行うことはできないためです(2行目なしで得た例外)。プロパティ パスを持たないことは、プロパティの 1 つではなく、完全な Row オブジェクトにバインドする必要があるため、よく考えれば意味があります。

注: VS 2008 SP1、WPF プロジェクトでテスト済み。

于 2010-02-25T16:46:30.433 に答える